【テクニカル・上級編】「マイルストーン」の自動追跡:主要イベントの依存関係を監視するダッシュボードVBA – Project VBA解析バイブル

スポンサーリンク

マイルストーンの崩壊を未然に防ぐ:Project VBAにおける依存関係追跡の極限

プロジェクトマネジメントにおいて、「マイルストーンの遅延」は単なるスケジュール上のミスではない。それは組織の信頼とキャッシュフローを蝕む静かなる癌だ。

多くの現場でWBSがExcel上で「ただの絵」と化しているのは、依存関係が動的に追跡されず、変更の影響が可視化されないからに他ならない。本稿では、Project VBAを駆使し、依存関係の連鎖を監視し、致命的な遅延をアラートとして叩き出す「自動追跡エンジン」の設計思想を解説する。

1. アーキテクチャの核心:再帰的探索とメモリ管理

依存関係(Predecessors)の追跡には、再帰アルゴリズムが不可欠だ。しかし、VBAで再帰を用いる際、安易なオブジェクト生成は即座にスタックオーバーフローやメモリリークを招く。

我々が目指すのは、「参照の連鎖を最小限のオブジェクト生存期間で処理する」ことだ。`Project.Tasks`コレクションを直接走査するのではなく、一度`Scripting.Dictionary`にキーとIDのマップを格納し、ルックアップ時間を$O(1)$に近づけるのが定石である。

2. マイルストーン監視エンジンの実装

以下に、依存関係を遡り、遅延の波及を計算するコアロジックを提示する。

‘ 依存関係を再帰的にチェックし、最大遅延を算出するモジュール
Option Explicit

Public Sub MonitorMilestoneDependencies(ByVal TargetTaskID As Long)
Dim proj As Project
Set proj = ActiveProject

‘ メモリ最適化: 頻繁に参照するTaskオブジェクトをキャッシュしない
‘ IDで管理し、必要最小限のアクセスに留める
Dim visited As Object
Set visited = CreateObject(“Scripting.Dictionary”)

Dim maxDelay As Long
maxDelay = CalculateDelay(proj.Tasks(TargetTaskID), visited)

If maxDelay > 0 Then
‘ Windows APIを用いたシステムトースト通知などをここに実装する
MsgBox “アラート: マイルストーンに ” & maxDelay & ” 日の遅延波及の可能性”, vbCritical
End If
End Sub

Private Function CalculateDelay(t As Task, ByRef visited As Object) As Long
If visited.Exists(t.ID) Then Exit Function
visited.Add t.ID, True

Dim pred As TaskDependency
Dim currentDelay As Long

‘ 依存関係のループを検証
For Each pred In t.TaskDependencies
‘ 完了が予定より遅れている先行タスクのみを評価
If pred.FromTask.Finish > pred.FromTask.BaselineFinish Then
currentDelay = DateDiff(“d”, pred.FromTask.BaselineFinish, pred.FromTask.Finish)
‘ 再帰的に親タスクの遅延を加算
currentDelay = currentDelay + CalculateDelay(pred.FromTask, visited)
End If
Next pred

CalculateDelay = currentDelay
End Function

3. パフォーマンスを極限まで高める:Windows APIの活用

大規模プロジェクト(数千タスク規模)では、VBAのシングルスレッド実行がボトルネックとなる。描画更新を止め、APIを用いてメモリを強制解放する術が必要だ。

特に、`Application.ScreenUpdating = False` は必須だが、さらに一歩進んで、処理の合間に `DoEvents` を適切に配置し、Windows メッセージループを制御せよ。また、大規模データ処理時には `CoFreeUnusedLibraries` を呼び出し、COMオブジェクトの残滓を掃除する意識を持て。

4. レガシー環境における保守の鉄則

Project VBAの最大の敵は、バージョン間のオブジェクトモデルの乖離ではなく、「仕様の硬直化」である。

  • 疎結合な設計: 依存関係ルールをコード内にハードコードするな。設定用の隠しシートに「依存の許容範囲」を持たせ、`DAO.Recordset`で読み込む構成にせよ。
  • 明示的なオブジェクト解放: `Set obj = Nothing` を忘れるな。特に `TaskDependency` のような動的生成されるコレクションは、ループ終了時に必ずスコープを閉じること。

結びに代えて

システムは完璧に動くことを要求されるのではない。「何が起きているか」を正確に伝達するために存在する。

このコードは、ただのタスク管理ツールではない。プロジェクトの現在地を冷徹に突きつける鏡だ。もし君がシニアエンジニアとしてこのツールを導入するなら、単なるバグ報告ではなく、このダッシュボードが示す「波及予測」を基に、PMと交渉し、先回りのリスク対策を打て。

技術とは、ツールを完成させることではない。ツールを通じてプロジェクトという名の巨大な生命体を制御することにある。健闘を祈る。

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