【入門編】Resourceの稼働率をVBAで計算する:Project標準機能を超えた独自の負荷分析レポートの作成 – Project VBA解析バイブル

スポンサーリンク

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` をマスターすれば、あなたはもう「マクロを使う人」ではなく、プロジェクトの未来を予測する「アーキテクト」です。

まずはこのコードをコピーして、ご自身の環境で動かしてみてください。データがログに出力された瞬間、プロジェクトの裏側が手に取るようにわかるはずです。

何か分からないことがあれば、いつでも聞いてください。応援していますよ。

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