【実務・中級編】リソースの「稼働率」をヒートマップ化するExcelアドイン連携VBA – Project VBA解析バイブル

スポンサーリンク

プロジェクトの「見えない過負荷」を可視化せよ: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の深淵へ潜り、データを支配せよ。

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