Project VBAの深淵へ:標準機能を超えた「リソース稼働率分析」の極意
こんにちは。現場で「Projectの標準レポートではどうしても足りない」と悩むあなたへ。
Microsoft Projectの標準レポートは確かに優秀ですが、真のプロジェクトマネージャーやPMOが求めるのは、「どのリソースが、いつ、どれだけパンクしているか」という、より解像度の高いインサイトです。
今日は、Project VBAを駆使して、リソースの稼働率を期間ごとに抽出し、Excelのヒートマップ作成へ繋げるための「データ抽出ロジック」を伝授します。マクロの記録から一歩先へ、真のエンジニアリングの世界へ足を踏み入れましょう。
—
1. Projectオブジェクトモデルの「心臓部」を理解する
Project VBAを操る上で、まず押さえるべきは以下の階層構造です。
- Application: プロジェクト全体を統括する親。
- Project: 開いている計画ファイル。
- Task: 作業の箱(WorkやDurationを持つ)。
- Resource: 人や設備。Taskと「Assignment(割り当て)」という絆で繋がっています。
ここが重要: 稼働率を出すために見るべきは、`Resource` オブジェクトそのものよりも、`Assignment`(割り当て) です。タスクとリソースを結びつけるこのオブジェクトこそが、時系列の負荷データを持つ「宝の山」なのです。
—
2. 実践:期間別リソース負荷抽出ロジック
それでは、各リソースの指定期間における「Work(作業時間)」を抽出するコードを見てみましょう。
Sub ExtractResourceWorkload()
Dim proj As Project
Dim res As Resource
Dim asgn As Assignment
Dim ts As TimeScaleValue
Dim startD As Date, endD As Date
Set proj = ActiveProject
startD = DateSerial(2023, 10, 1) ‘ 集計開始日
endD = DateSerial(2023, 10, 31) ‘ 集計終了日
‘ Excelへ出力するための準備(適宜ワークシートをセット)
Debug.Print “ResourceName, Date, WorkHours”
‘ 全リソースをループ
For Each res In proj.Resources
If Not res Is Nothing Then
‘ 各リソースに割り当てられているタスクを走査
For Each asgn In res.Assignments
‘ TimeScaleDataを使って期間内の負荷を抽出
‘ pjAssignmentTimescaledWork は「時間単位の作業」を意味します
Dim tsvs As TimeScaleValues
Set tsvs = asgn.TimeScaleData(startD, endD, pjAssignmentTimescaledWork, pjTimescaleDays)
For Each ts In tsvs
‘ ts.Valueは分単位で返るため、時間に変換
If ts.Value > 0 Then
Debug.Print res.Name & “,” & ts.StartDate & “,” & (ts.Value / 60)
End If
Next ts
Next asgn
End If
Next res
End Sub
このコードの「本質」
- `TimeScaleData` メソッド: これが今回の核です。指定した期間を「日単位」「週単位」で切り刻み、その期間の作業量を返してくれます。これを使わずに自分で計算しようとすると、地獄を見ます。
- 分単位の罠: Projectの内部データは、基本的に「分」で保持されています。時間に変換する ` / 60` を忘れないようにしましょう。
—
3. 陥りやすい「落とし穴」を回避する
初心者が最初にぶつかる壁が2つあります。
① `res.Assignments` が空の場合
リソースを作成しただけでタスクに割り当てていない場合、エラーにはなりませんが、ループが空回りします。`If Not res Is Nothing` のチェックは必須の作法です。
② パフォーマンスの重み
タスク数が数千件を超えると、全ループは非常に重くなります。
- 回避策: 不要な計算を行わないよう、`Application.ScreenUpdating = False` を利用し、描画を止めてから実行してください。また、`For Each` は便利ですが、巨大なデータセットの場合はインデックスアクセスの方が高速なケースもあります。
—
4. Excelヒートマップへの展開
このコードで得られたCSVデータ(または配列)をExcelに流し込み、「条件付き書式」 を使ってみてください。
1. 行: リソース名
2. 列: 日付
3. 値: Work(時間)
Excelの「カラースケール」を適用するだけで、Project標準のレポートでは決して表現できない、「チームの誰が、どの週に、キャパシティを超えているか」が一目でわかる強力なヒートマップが完成します。
—
最後に:エンジニアとしての一歩
Project VBAは、他のOffice製品と異なり「時間の経過」という概念が強く結びついています。今回紹介した `TimeScaleData` をマスターすれば、あなたはもう「マクロを使う人」ではなく、プロジェクトの未来を予測する「アーキテクト」です。
まずはこのコードをコピーして、ご自身の環境で動かしてみてください。データがログに出力された瞬間、プロジェクトの裏側が手に取るようにわかるはずです。
何か分からないことがあれば、いつでも聞いてください。応援していますよ。
