【入門編】リソースの「稼働率」を週次でスナップショット保存し、推移を分析するマクロ – Project VBA解析バイブル

スポンサーリンク

こんにちは!Project VBAの世界へようこそ。
マクロの記録ボタンを押すだけのステージから一歩進み、自分の手でプロジェクトを意のままにコントロールしたいあなたへ。

今回は、現場のプロジェクトマネジメントで間違いなく重宝される「リソース稼働率の週次スナップショット保存と推移分析マクロ」を一緒に作っていきます。

「リソースが今、本当にパンクしていないか?」
「先週と比べて、誰の負荷が急増したのか?」

こうした現場の切実な疑問にスパッと答えられる履歴管理ツールを、VBAの底力を使って構築しましょう。ここをクリアすれば、Project VBAの基本はバッチリですよ。優しく、そして本質的に解説していきますね。

—

なぜ「週次スナップショット」が必要なのか?

MS Projectの標準画面では「今この瞬間の稼働率」は見られますが、「先週はどうだったか」「1ヶ月前と比べて負荷はどう推移しているか」という歴史データ(時系列)を標準機能だけで綺麗に残すのは、意外と手間がかかります。

そこでVBAの出番です。
毎週金曜日の定例バッチのように、あるいはボタンひとつで、その時点のリソースごとの稼働率(Peak Unitsなど)を別シート(または別ブック)に「パシャリ」と写真(スナップショット)のように記録していく。この仕組みを作れば、Excelと連携して綺麗なトレンドグラフを描くことも容易になります。

—

今回のアーキテクチャと攻略のポイント

Project VBAを扱う上で、絶対に知っておくべき大原則があります。それは「オブジェクトの階層構造を正確に捉えること」。

Excel VBAと同じ感覚で `Cells(1,1)` などと書くと、Project特有の「リソース」「タスク」「割り当て(Assignment)」の複雑な関係性で迷子になります。

今回のマクロの全体像はこうです。
1. 出力用シート(または別ファイル)の準備:履歴を蓄積する場所を定義する。
2. プロジェクト内の全リソースを走査:`ActiveProject.Resources` をループする。
3. 稼働率の取得:各リソースの現在の稼働状況を読み取る。
4. 履歴シートへの書き込み:タイムスタンプ(実行日)とともにデータを追記する。

—

実装コード:週次スナップショット・マクロ

それでは、実際にプロジェクトの標準モジュールに貼り付けて動かせる実用コードを公開します。コード内のコメントをしっかりと読みながら、動きをイメージしてください。

Sub SaveResourceWorkloadSnapshot()
‘ ==============================================================================
‘ テーマ: リソースの「稼働率」を週次でスナップショット保存するマクロ
‘ 著者の視点: オブジェクトのライフサイクルを意識し、確実かつ高速にデータを収集する
‘ ==============================================================================

Dim prj As Project
Set prj = ActiveProject

Dim res As Resource
Dim targetSheet As Worksheet
Dim historyRow As Long
Dim snapshotDate As Date

‘ 実行日の取得(今回は現在日付をスナップショット日とします)
snapshotDate = Date

‘ 【エラー対策】Excel連携の準備
‘ ※ProjectからExcelを操作してデータを蓄積する堅牢なアプローチを取ります。
Dim xlApp As Object
Dim xlWb As Object
Dim xlPath As String
Dim wsName As String
wsName = “ResourceHistory”

On Error Resume Next
‘ すでに起動しているExcelインスタンスを取得、なければ新規作成
Set xlApp = GetObject(, “Excel.Application”)
If xlApp Is Nothing Then
Set xlApp = CreateObject(“Excel.Application”)
End If
On Error GoTo 0

‘ 保存先のExcelファイルパス(あらかじめデスクトップ等に用意したファイルを想定)
‘ ※環境に合わせてパスを書き換えてください
xlPath = “C:\ProjectData\ResourceWorkloadHistory.xlsx”

Set xlWb = xlApp.Workbooks.Open(xlPath)
If xlWb Is Nothing Then
MsgBox “指定された履歴用Excelファイルが見つかりません。パスを確認してください。”, vbCritical, “エラー”
Exit Sub
End If

‘ 履歴シートが存在するか確認し、なければ作成する
Dim wsExists As Boolean
wsExists = False
Dim sh As Object
For Each sh In xlWb.Sheets
If sh.Name = wsName Then
wsExists = True
Exit For
End If
Next sh

If wsExists Then
Set targetSheet = xlWb.Sheets(wsName)
Else
Set targetSheet = xlWb.Sheets.Add(After:=xlWb.Sheets(xlWb.Sheets.Count))
targetSheet.Name = wsName
‘ ヘッダーの作成
targetSheet.Cells(1, 1).Value = “記録日”
targetSheet.Cells(1, 2).Value = “プロジェクト名”
targetSheet.Cells(1, 3).Value = “リソースID”
targetSheet.Cells(1, 4).Value = “リソース名”
targetSheet.Cells(1, 5).Value = “最大稼働率(Max Units)”
targetSheet.Cells(1, 6).Value = “実稼働率(Peak Units等)”
End If

‘ データの書き込み行を特定(最終行の次)
historyRow = targetSheet.Cells(targetSheet.Rows.Count, 1).End(xlUp).Row + 1

‘ Excelの画面描画を停止して高速化
xlApp.ScreenUpdating = False

‘ ==============================================================================
‘ コア処理: プロジェクト内の全リソースをループして稼働率をキャプチャ
‘ ==============================================================================
For Each res In prj.Resources
‘ リソースが空白(Null)でない場合のみ処理
If Not res Is Nothing Then
If res.Name <> “” Then
targetSheet.Cells(historyRow, 1).Value = snapshotDate
targetSheet.Cells(historyRow, 2).Value = prj.Name
targetSheet.Cells(historyRow, 3).Value = res.ID
targetSheet.Cells(historyRow, 4).Value = res.Name

‘ MaxUnits(最大units)はパーセンテージ(例: 100%は1.0、200%は2.0)で格納されるため調整
targetSheet.Cells(historyRow, 5).Value = res.MaxUnits

‘ PeakUnits(ピークunits)を取得(過負荷の検知に最も重要)
targetSheet.Cells(historyRow, 6).Value = res.PeakUnits

‘ 次の行へ
historyRow = historyRow + 1
End If
End If
Next res

‘ 変更を保存してExcelを閉じる
xlWb.Save
xlWb.Close SaveChanges:=True
xlApp.ScreenUpdating = True

‘ 完了メッセージ
MsgBox “リソース稼働率のスナップショット保存が完了しました!”, vbInformation, “成功”
End Sub

—

コードの深掘り解説:ここがエンジニアの腕の見せ所

初心者の方が躓きやすいポイントや、プロのエンジニアが意図して組んでいる設計の急所を解説します。

1. なぜExcelへデータを書き出すのか?

Project単体でもカスタムフィールドや別プロジェクトへの保存は可能ですが、「時系列の蓄積・分析・グラフ化」という点において、Excelの表現力とデータ蓄積能力には及びません。Projectは「管理の主戦場」、Excelは「分析・ビジュアライゼーションの主戦場」と役割を明確に分けるのが、実務で破綻しないアーキテクチャの鉄則です。

2. `MaxUnits` と `PeakUnits` の違いを知る

  • MaxUnits(最大稼働率):そのリソースがリソースプール等で定義されている最大キャパシティ(例: 100% = 1人分フル稼働)。
  • PeakUnits(ピーク稼働率):ある期間内において、そのリソースが抱えるタスクの重なりによって発生した「最も負荷が高くなった瞬間の稼働率」。
  • ここがポイント! PeakUnits が MaxUnits を超えている場合(例: 150%など)、そのリソースは「オーバーアロケーション(過負荷)」を起こしています。このデータを毎週蓄積することで、「この人は3週間連続で120%超えだ」といったトレンドが丸わかりになります。

3. パフォーマンスと安全性の担保 (`ScreenUpdating` と `GetObject`)

巨大なプロジェクトになると、リソースが数百人に及ぶこともあります。Excelを裏側で操作する際に `ScreenUpdating = False` を挟むことで、画面のチラつきを防ぎ、処理速度を劇的に向上させています。また、Excelがすでに開いていればそれを再利用し、なければ新規生成する `GetObject` のテクニックは、VBA実務において必須の守り技です。

—

陥りやすいエラーと回避の心得

1. 「オブジェクト変数または With ブロック変数が見つかりません」エラー

  • 原因:MS ProjectのVBE(Visual Basic Editor)で、まだプロジェクトファイルが開かれていない状態で `ActiveProject` を叩いたときなどに発生します。
  • 対策:必ず何らかの `.mpp` ファイルをアクティブにした状態でマクロを実行してください。

2. 実行時エラー ‘429’: 先生、Excelのオブジェクトが作れません!

  • 原因:PCにExcelがインストールされていない、またはOfficeのインストールが破損している場合。
  • 対策:Office製品の共存環境を確認しましょう。また、コード内のファイルパス (`C:\ProjectData\…`) が実際に存在するか事前にフォルダを作成しておく必要があります。

—

おわりに

いかがでしたか?
「ボタンひとつで、組織の歪み(リソースの過負荷)がデータとして蓄積されていく」。この仕組みを自分の手で作り上げることができれば、あなたも単なるマクロの利用者から、「現場の業務プロセスをデザインするエンジニア」へとステップアップしています。

ここをクリアできれば、Project VBAの基本はもうバッチリです。
次は、この蓄積されたExcelデータを元に「リソース負荷ヒートマップ」を自動生成する応用編に挑戦してみるのも面白いですね。

あなたのVBAライフが、よりエキサイティングで実務に直結するものになりますように。それでは、また次のアーキテクチャ解説でお会いしましょう!

タイトルとURLをコピーしました