【テクニカル・上級編】リソースの「オーバーアロケーション」を解消するための自動平準化シミュレーター – Project VBA解析バイブル

スポンサーリンク

MS Project VBAの深淵:標準平準化機能を凌駕する「カスタム・リソース平準化エンジン」の実装

Project標準の「平準化」機能は、魔法の杖ではない。それは往々にしてプロジェクトのスケジュールを崩壊させ、現場の混乱を招く「ブラックボックス」だ。シニアエンジニアである君たちが求めるのは、予測不能な自動化ではない。ビジネスロジックに直結した、制御可能な決定論的アルゴリズムだ。

今日は、Projectのオブジェクトモデルを掌握し、オーバーアロケーションを意図した優先順位で解消する「カスタム平準化エンジン」の設計思想を伝授する。

—

1. なぜ標準機能では不十分なのか

標準の平準化は、タスクID順や優先度といった単純な指標に依存する。しかし、現実のプロジェクトは「重要顧客のタスクを死守する」「リソースの習熟度を考慮する」といった、プログラムの外にあるコンテキストに支配されている。

我々が実装すべきは、「リソースの稼働率(Work)を監視し、閾値を超えたタスクを優先順位に従って後方へシフトさせる」という自律的なシミュレーターだ。

2. アーキテクチャの核心:オブジェクト寿命の管理

VBAでの大量データ処理において、最も避けるべきは「断片的なオブジェクト参照」だ。`ActiveProject.Tasks`をループ内で直接叩くのは自殺行為に等しい。

  • 極意1: `Task`オブジェクトを直接操作せず、一度配列またはCollectionにキャッシュする。
  • 極意2: `Application.ScreenUpdating = False` は必須だが、さらに `Application.Calculation = pjManual` に設定し、再計算のオーバーヘッドを遮断せよ。

—

3. 実装コード:カスタム平準化エンジン

このコードは、指定されたリソースの稼働限界を超えたタスクを、優先度(CustomFlag1等を利用)に基づいて後ろ倒しにするロジックの骨子である。

‘ 伝説的な平準化エンジンのコアロジック
Public Sub RunCustomLeveling(TargetResourceName As String, MaxDailyHours As Double)
Dim proj As Project
Dim tsks As Tasks
Dim tsk As Task
Dim res As Resource

Set proj = ActiveProject
Set res = proj.Resources(TargetResourceName)

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

‘ プロセス監視:メモリリークを防ぐための明示的な解放
On Error GoTo Cleanup

‘ 優先順位でソートされたタスクをシミュレートする
‘ ここでは簡略化のため、優先度(Priority)で降順ソートされた前提で処理
For Each tsk In proj.Tasks
If Not tsk Is Nothing Then
If IsResourceOverAllocated(tsk, res, MaxDailyHours) Then
‘ リソースが過負荷であれば開始日を+1日する
tsk.Start = tsk.Start + 1
End If
End If
Next tsk

Cleanup:
Application.Calculation = pjAutomatic
Application.ScreenUpdating = True
Set tsk = Nothing
Set res = Nothing
Set proj = Nothing
End Sub

‘ リソース稼働率の検証ロジック
Private Function IsResourceOverAllocated(tsk As Task, res As Resource, limit As Double) As Boolean
‘ ここにAssignmentオブジェクトを走査するロジックを配置
‘ 実際の稼働時間を取得し、limitと比較する
‘ 開発の現場では、ここにWindows APIを使って処理時間を計測するロガーを仕込むと尚良し
IsResourceOverAllocated = (tsk.Work / 8 > limit) ‘ 簡易的な判定
End Function

—

4. パフォーマンスを極めるためのシニアの知見

レガシー環境との共存:メモリリークの排除

Project VBAは、`Set`で割り当てたオブジェクトを放置すると、大規模なプロジェクトファイルではメモリが肥大化する。`Set tsk = Nothing`は、ただの作法ではなく、アーキテクトとしての「責任」だ。

Windows APIによる「時間」の支配

平準化アルゴリズムが複雑化すると、実行時間が予測できなくなる。`QueryPerformanceCounter`などのWindows APIを活用し、処理に要したミリ秒単位のログを外部テキストファイルに出力する仕組みを組み込め。これが運用保守における「ボトルネックの特定」を劇的に早める。

システム間連携の勘所

もしこの平準化結果を外部のERPやBIツールへ流すのであれば、`Project.SaveAs`の形式に注意せよ。`pjXML`形式で保存し、それをPython等の外部処理系でパースするのが、最も安定したパイプラインだ。VBAだけで完結させようとせず、VBAを「制御のハブ」として定義するのが、現代的なアーキテクチャである。

—

結びに代えて

平準化アルゴリズムをVBAで書くということは、プロジェクトの「意思」をコードに落とし込むということだ。標準機能のボタンを一つ押すだけで済ませるか、それともプロジェクトの特性を理解した独自のロジックを刻むか。

君たちが選ぶその道こそが、レガシーを「遺産」に変えるか「負債」に変えるかの分かれ目になる。コードには魂を込めろ。そして、常にメモリの先を見据えよ。

さあ、次のプロジェクトを君のロジックで制御する準備はできたか?

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