プロジェクトの「見えない過負荷」を可視化せよ:Project VBAによる稼働率ヒートマップ構築術
プロジェクトマネジメントにおいて、最も恐ろしいのは「リソースの空き」という幻想だ。Excelでガントチャートを管理し、なんとなくの感覚でアサインを決めていないか?
その甘えが、プロジェクト後半の急激な遅延と燃え尽き症候群を生む。今日は、Microsoft Projectの深淵に潜り、VBAを用いてリソースの「真の稼働率」をExcelのヒートマップとして抽出し、可視化するアーキテクチャを伝授する。
これは単なる集計ツールではない。「ボトルネックを直視するための経営判断材料」を生成するエンジニアリングだ。
—
1. なぜ「セル操作」を繰り返してはいけないのか
多くのジュニアエンジニアは、Projectから値を一行ずつ取得し、Excelに書き込むループを書く。これは自殺行為だ。COMオブジェクトを介した`ActiveProject.Resources`へのアクセスは極めて重い。
鉄則:データは「配列」に閉じ込めてから処理せよ。
Projectからメモリ上にデータを引き抜き、VBAの配列内で計算を完結させ、最後にExcelへ一括転送(バルク書き込み)する。これが数千行のプロジェクトでも瞬時に動く「プロの作法」だ。
—
2. 高速抽出のためのアーキテクチャ設計
以下の実装では、Projectの`Assignment`オブジェクトから稼働時間を抽出し、Excel側のカレンダー行列にマッピングする手法をとる。
【実装コード:Project側からデータを吸い上げる】
‘ 参照設定: Microsoft Project 16.0 Object Library
‘ 参照設定: Microsoft Excel 16.0 Object Library
Public Sub ExportResourceUtilization()
Dim prj As Project
Dim res As Resource
Dim asn As Assignment
Dim rowData() As Double ‘ 稼働率格納用配列
Dim resCount As Long, dayCount As Long
Set prj = ActiveProject
resCount = prj.Resources.Count
dayCount = 30 ‘ 直近30日を可視化対象とする
ReDim rowData(1 To resCount, 1 To dayCount)
‘ 1. 配列への高速データ格納
Dim i As Long, j As Long
For i = 1 To resCount
Set res = prj.Resources(i)
‘ リソース単位の期間別稼働率を計算して配列に突っ込む
For j = 1 To dayCount
‘ ここでAssignmentのTimephasedDataを活用する
‘ ※本来はAssignmentオブジェクトのTimeScale値をループさせる
rowData(i, j) = GetResourceDailyLoad(res, j)
Next j
Next i
‘ 2. Excelへの一括転送
Dim xlApp As Object, wb As Object
Set xlApp = CreateObject(“Excel.Application”)
Set wb = xlApp.Workbooks.Add
wb.Sheets(1).Range(“B2”).Resize(resCount, dayCount).Value = rowData
xlApp.Visible = True
End Sub
—
3. 「ヒートマップ」を完成させるためのExcel連携テクニック
データを転送するだけでは不十分だ。Excel側で「条件付き書式」をコードで適用し、直感的なインターフェースを自動生成せよ。
- 閾値の設定: 稼働率80%を黄色、100%超を赤色に設定する。
- 動的範囲: データの増減に合わせて`Range`を自動拡張させること。
‘ Excel側で実行する条件付き書式の自動設定ロジック(抜粋)
Sub ApplyHeatMapFormat(targetRange As Range)
With targetRange.FormatConditions.Add(Type:=xlCellValue, Operator:=xlGreaterEqual, Formula1:=”1.0″)
.Interior.Color = RGB(255, 100, 100) ‘ 赤:過負荷
End With
With targetRange.FormatConditions.Add(Type:=xlCellValue, Operator:=xlBetween, Formula1:=”0.8″, Formula2:=”1.0″)
.Interior.Color = RGB(255, 255, 150) ‘ 黄:警戒
End With
End Sub
—
4. 陥りやすい罠:パフォーマンスと保守性
1. TimephasedDataの罠:
Projectの`TimephasedData`は非常に強力だが、期間指定を誤るとメモリリークや計算遅延を引き起こす。必要な期間分だけ`Application.ActiveProject.StatusDate`を基準にスライスして取得せよ。
2. 型変換の注意:
Projectの稼働率は内部的にパーセンテージ(例: 0.5 = 50%)で保持される。Excel側で表示する際、数値フォーマットを`0%`に指定することを忘れるな。
3. クリーンアップ:
`Set xlApp = Nothing` を忘れると、バックグラウンドにゾンビプロセスが残る。`On Error GoTo`でエラーハンドリングを徹底し、異常終了時にもインスタンスを確実に解放せよ。
最後に:エンジニアとしての矜持
このツールを完成させれば、あなたは「なぜプロジェクトが遅れているのか」を感情論ではなく、データという名の真実で語れるようになる。
コードは書くこと以上に「読まれること」を想定せよ。変数名は明示的に、ロジックは最小単位に分割する。このアプローチこそが、複雑なプロジェクト環境を制御下に置く唯一の道だ。
さあ、Projectの深淵へ潜り、データを支配せよ。
