【実務・中級編】複数プロジェクト間でのリソース競合を可視化するダッシュボード作成 – Project VBA解析バイブル

スポンサーリンク

リソースの「取り合い」を可視化せよ: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で「リソースヒートマップ」を作成する。

これが「世界最高峰の業務自動化」の正体だ。

—

アーキテクトからの助言

ツールを作って終わりにするな。このダッシュボードの目的は「誰が忙しいか」を指摘することではなく、「ボトルネックとなっているリソースを特定し、プロジェクトの優先順位を経営層と合意する」ための意思決定材料を作ることだ。

コードはあくまで道具。その先にいる「疲弊するエンジニア」を救い、プロジェクトの成功率を最大化させることこそが、君の真のミッションだ。

さあ、エディタを開け。このコードをベースに、君のプロジェクトに最適な「武器」を作り上げろ。期待している。

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