Project VBAの深淵:リソース可視化が暴く「見えないボトルネック」の正体
MS ProjectのVBA(PJOM)を扱う際、多くのエンジニアは単なる「自動化」で満足する。だが、真のアーキテクトにとって、Projectは単なるタスク管理ツールではない。それは、組織の血流である「リソースの時系列データ」が格納されたデータベースであり、その可視化こそがプロジェクトの命運を分ける。
本稿では、リソースの稼働率(Resource Usage)を抽出し、ExcelやPythonへ橋渡ししてボトルネックを浮き彫りにする、実務直結の極限的アプローチを解説する。
—
1. なぜ「標準機能」では足りないのか
Projectの標準レポートは「今、何が起きているか」を示すには優秀だが、「なぜそのボトルネックが発生したか」という因果関係のトレースには向かない。
- 過負荷の可視化: 稼働率100%超えは警告が出るが、その負荷が「どのタスクの積み重ねによるものか」を動的に分析するには、`Assignment`(割り当て)オブジェクトの時系列データを叩く必要がある。
- メモリとパフォーマンス: 数千件の割り当て(Assignment)を持つプロジェクトで全データをループさせれば、VBAは容易にスタックする。メモリを解放し、インターフェースを最適化する「防御的プログラミング」が必須となる。
—
2. 実装の核心:Assignmentデータ抽出の最適化
リソースの稼働率データを抽出する場合、`Resource.Assignments`から辿るのが定石だが、単にループを回すのは愚策だ。`TimeScaleValues`を活用し、週次や月次の時系列データを直接バイナリに近い感覚で抜き出す。
以下のコードは、リソースの過負荷を特定するために必要なデータを、メモリ効率を考慮して抽出するコアロジックである。
‘ — リソース稼働率抽出の最適化ロジック —
Public Sub ExportResourceWorkload(targetProject As Project)
Dim res As Resource
Dim tsvs As TimeScaleValues
Dim tsv As TimeScaleValue
‘ 画面描画を停止し、再計算を抑制(パフォーマンスの鉄則)
Application.ScreenUpdating = False
Application.Calculation = pjManual
For Each res In targetProject.Resources
If Not res Is Nothing Then
‘ 割り当てられたタスクのWorkをTimeScaleで取得
Set tsvs = res.TimeScaleData(targetProject.ProjectStart, _
targetProject.ProjectFinish, _
pjResourceTimescaledWork, _
pjTimescaleWeeks)
For Each tsv In tsvs
‘ ここでtsv.Value(Work)をバッファリングする
‘ 0の場合はメモリを無駄にしないようスキップ
If tsv.Value > 0 Then
‘ 外部への書き出し処理(CSVまたはExcelシートへ)
Call AppendToBuffer(res.Name, tsv.StartDate, tsv.Value)
End If
Next tsv
‘ 明示的なオブジェクト解放(循環参照を防ぐ)
Set tsvs = Nothing
End If
Next res
Application.Calculation = pjAutomatic
Application.ScreenUpdating = True
End Sub
—
3. Windows APIによるメモリとプロセスの制御
大規模なプロジェクトファイルを扱う際、VBAのメモリ領域は「ゴミ」で溢れかえる。`CoFreeUnusedLibraries`を呼び出し、ガベージコレクションを強制的に促す手法や、`GetProcessMemoryInfo`で自身のメモリ使用量を監視する手法は、レガシー環境の保守において生命線となる。
‘ メモリの断片化を最小限に抑えるためのAPI宣言
Private Declare PtrSafe Sub CoFreeUnusedLibraries Lib “ole32.dll” ()
Sub CleanupMemory()
‘ 長時間の処理の合間に呼び出すことで、
‘ キャッシュされたライブラリを解放し、プロセスの肥大化を防ぐ
CoFreeUnusedLibraries
End Sub
—
4. Python/Excel連携:ボトルネックを「視覚化」する
抽出したデータは、Excelのピボットグラフで「ヒートマップ」化するのが最も効果的だ。リソース名を縦軸、期間を横軸にし、稼働率(Work / Capacity)を条件付き書式で色付けすれば、誰の目がどこで詰まっているかが一目で分かる。
さらに一歩進むなら、このCSVをPython(Pandas + Seaborn)に流し込み、「リソースのクリティカルパス分析」を行うべきだ。
1. データ正規化: 抽出した時系列データをPandas DataFrameに変換。
2. ボトルネック特定: 稼働率閾値(例: 85%以上)を連続して超えるリソースを抽出。
3. ヒートマップ出力: Seabornの`heatmap`で、プロジェクト全体の「負荷のうねり」を可視化する。
—
5. アーキテクトからの提言
プロジェクトのボトルネックは、多くの場合「特定のリソースへの過度な依存」から生じる。しかし、現場の人間はその兆候を「なんとなく忙しい」という感覚でしか捉えていない。
あなたがやるべきことは、「感覚をデータに変換すること」だ。
- リソースを殺すな: 稼働率データは、誰かを追い詰めるためではなく、組織の負荷を平準化するための「羅針盤」である。
- レガシーを恐れるな: 20年前のProject 2003から最新のProject Onlineまで、オブジェクトの構造は本質的に変わっていない。APIを掌握し、メモリを制御し、静かなる最適化を続けろ。
この知見を実装した瞬間、あなたの管理するプロジェクトから「炎上」という言葉は消えるはずだ。健闘を祈る。
