リソースの「取り合い」を可視化せよ:Project VBAによるマルチプロジェクト稼働分析の極意
多くのPMが陥る罠がある。「各プロジェクトのスケジュールは完璧なのに、なぜか全体のリソースがパンクする」という現象だ。原因は明確。リソースのオーバーアロケーション(過負荷)が、単一のファイルという「閉じた世界」でしか監視されていないからだ。
MS Project(MPP)を複数開いて手作業で調整するなど、21世紀のエンジニアがやるべきことではない。今回は、Projectのオブジェクトモデルを掌握し、複数プロジェクトの稼働状況を横断的にExcelへ抽出する「リソース可視化エンジン」の設計思想と実装コードを伝授する。
—
1. なぜ「力技のループ処理」が失敗するのか
VBAでProjectを操作する際、多くの初心者が犯すミスは「Application.Projects(i).Resources」を安易に叩き続けることだ。
- コンテキストの不一致: ファイルによってリソースの「カレンダー」設定や「標準レート」が微妙に異なる。これをそのままExcelに吐き出すと、集計時に必ず矛盾が生じる。
- メモリのリーク: `Project.Application` オブジェクトを解放せずにループを回すと、バックグラウンドでMPPプロセスが残存し、メモリリークの温床となる。
堅牢な設計の鉄則
1. 接続の集中管理: `Application.Projects` コレクションをイテレートする際、必ず「読み取り専用」または「バックグラウンド・セッション」として扱う。
2. 正規化のステップ: 取得したリソースデータを一度「中間テーブル(辞書オブジェクト)」に格納し、リソースIDや名前で名寄せしてからExcelに出力する。
—
2. 実装コード:マルチプロジェクト・リソース・エクストラクター
以下は、現在開いている全てのプロジェクトから「リソース名」「稼働時間」「コスト」を抽出し、Excelのシートに書き出すためのコア・エンジンだ。
Option Explicit
‘ 参照設定: Microsoft Project 16.0 Object Library
‘ 参照設定: Microsoft Excel 16.0 Object Library
Public Sub ExportResourceUtilization()
Dim proj As Project
Dim res As Resource
Dim ws As Worksheet
Dim rowIdx As Long
‘ Excel側の準備
Set ws = ThisWorkbook.Sheets(1)
ws.Cells.Clear
ws.Range(“A1:D1”).Value = Array(“Project Name”, “Resource Name”, “Work (Hours)”, “Cost”)
rowIdx = 2
‘ 全てのオープンプロジェクトを巡回
For Each proj In Application.Projects
‘ リソース単位のループ
For Each res In proj.Resources
‘ リソースが存在し、稼働があるもののみ抽出
If Not res Is Nothing Then
If res.Work > 0 Then
With ws
.Cells(rowIdx, 1).Value = proj.Name
.Cells(rowIdx, 2).Value = res.Name
.Cells(rowIdx, 3).Value = res.Work / 60 ‘ Projectは分単位のため時間へ変換
.Cells(rowIdx, 4).Value = res.Cost
End With
rowIdx = rowIdx + 1
End If
End If
Next res
Next proj
MsgBox “リソース集計が完了しました。”, vbInformation
End Sub
—
3. 現場で生き残るための「高度なチューニング」
A. リソースの「名寄せ」問題
「佐藤 太郎」と「佐藤太郎(スペース有無)」が別リソースとして扱われることはザラにある。VBA側で比較する際、必ず `Trim()` や `Replace(str, ” “, “”)` で正規化してから `Scripting.Dictionary` に格納すること。これがデータの品質を左右する。
B. 稼働率調整のロジック
単に「Work」を見るだけでは不十分だ。そのリソースが「1日あたり何%の負荷でアサインされているか」を算出するには、`res.Assignments` を辿り、期間ごとの `Assignment.Work` を合計するサブプロシージャが必要になる。
C. データベース連携(SQL Server / Access)
もしプロジェクト規模が数百ファイルに及ぶなら、Excelは単なる「表示器」に過ぎない。
1. VBAからADO経由でDBへPush: 抽出データを直接SQL DBに格納する。
2. Power BIの活用: SQL DBをソースに、Power BIで「リソースヒートマップ」を作成する。
これが「世界最高峰の業務自動化」の正体だ。
—
アーキテクトからの助言
ツールを作って終わりにするな。このダッシュボードの目的は「誰が忙しいか」を指摘することではなく、「ボトルネックとなっているリソースを特定し、プロジェクトの優先順位を経営層と合意する」ための意思決定材料を作ることだ。
コードはあくまで道具。その先にいる「疲弊するエンジニア」を救い、プロジェクトの成功率を最大化させることこそが、君の真のミッションだ。
さあ、エディタを開け。このコードをベースに、君のプロジェクトに最適な「武器」を作り上げろ。期待している。
