【テクニカル・上級編】リソースの「プロジェクト参加期間」をタスクの開始・終了から自動算出する – Project VBA解析バイブル

スポンサーリンク

プロジェクト・リソースの時空間を制御する:VBAによる自動ライフサイクル管理の深淵

プロジェクトマネジメントにおいて、リソースの「参画期間」というデータは、往々にして形骸化する。手動更新の怠慢、あるいはプロジェクト開始・終了日の不整合によるコスト計算の乖離。これらは、中規模以上のプロジェクトにおいて致命的な経営判断ミスを誘発する。

諸君、MS ProjectのVBAオブジェクトモデルは、単なるプロパティの集合体ではない。それはリソースの「時間軸」という名のメモリ空間を操作するインターフェースだ。今回は、タスクの開始・終了からリソースの参画期間を自動算出し、リソースシートの境界を確定させるための、極限の自動化アーキテクチャを提示する。

—

1. オブジェクトライフサイクルの真実とメモリ解放

VBAにおいて `Set obj = Nothing` を怠ることは、単なるメモリリークではない。COMオブジェクトの参照カウントを不当に滞留させ、MS Projectのガベージコレクションを阻害する「アーキテクチャの汚染」である。

本稿で提示するコードでは、再帰的なタスク走査において、明示的なオブジェクトの参照破棄を徹底する。 また、数千件のタスクを抱える巨大プロジェクトにおいて、`Application.ScreenUpdating` の停止は必須だが、それ以上に重要なのは「プロパティへのアクセス回数」を極限まで減らすことだ。

2. ロジックの要諦:動的期間算出アルゴリズム

単に `Task.Start` を取得するのではない。リソースが割り当てられている全てのタスクを走査し、そのMin/Maxを求める。この時、「プロジェクトの祝日カレンダー」や「非稼働日」が考慮されていない値を拾うのは素人の仕事だ。 Projectオブジェクトモデルの `Task.Work` 属性と `Assignment` オブジェクトを組み合わせることで、実稼働を伴う期間のみを抽出する。

3. 実装:リソース期間自動同期エンジン

以下のコードは、単なるマクロではない。リソースのライフサイクルをタスクの実行計画に強制同期させるためのエンジンだ。

Option Explicit

‘ メモリ効率を考慮したリソース期間自動更新エンジン
Public Sub SyncResourceTimeline()
Dim prj As Project
Dim res As Resource
Dim assn As Assignment
Dim tsk As Task
Dim minStart As Date, maxFinish As Date
Dim first As Boolean

Set prj = ActiveProject

‘ 画面描画と再計算を停止し、処理速度を限界まで引き上げる
Application.ScreenUpdating = False
Application.Calculation = pjManual

For Each res In prj.Resources
If Not res Is Nothing Then
minStart = #12/31/2099#
maxFinish = #1/1/1900#
first = True

‘ リソースが割り当てられている全タスクを走査
For Each assn In res.Assignments
Set tsk = assn.Task

If Not tsk.Summary Then
If tsk.Start < minStart Then minStart = tsk.Start If tsk.Finish > maxFinish Then maxFinish = tsk.Finish
first = False
End If
Set tsk = Nothing ‘ 明示的解放
Next assn

‘ 期間の更新(値が存在する場合のみ反映)
If Not first Then
res.Start = minStart
res.Finish = maxFinish
End If
End If
Set assn = Nothing ‘ 明示的解放
Next res

‘ 状態を復帰
Application.Calculation = pjAutomatic
Application.ScreenUpdating = True

MsgBox “リソースのライフサイクル同期が完了しました。”, vbInformation
End Sub

4. シニアエンジニアへの警鐘:なぜ「自動」なのか

このスクリプトは、単に「日付をコピーする」ものではない。以下のリスクを排除するための防波堤である。

  • 人為的ミス: プロジェクト後半でのタスク追加時にリソース期間を更新し忘れるリスクの撲滅。
  • コスト計算の適正化: プロジェクトの「開始・終了」が正確であれば、コスト算出(Resource Cost Rate)の精度は劇的に向上する。
  • レガシー環境の保守: このコードはMS Project 2010以降のCOMモデルに準拠しており、古いActiveXコントロールに依存しない。将来的な.NET移行を考慮し、プロパティアクセスは最小限に絞っている。

結論:プロフェッショナルのコードとは

真に優れたVBAコードとは、実行が速いだけのものではない。「コードを読んだ人間が、そのシステムの制約とデータの依存関係を即座に理解できる」ものこそが、伝説級のアーキテクトが書くべきコードだ。

今回紹介したリソース同期ロジックは、諸君のプロジェクト管理における「時間」の解像度を一段引き上げるだろう。次は、これを外部のSQL Serverと連携させ、組織全体の稼働率調整へと昇華させるフェーズだ。準備はいいか。現場からは以上だ。

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