【テクニカル・上級編】依存関係と制約条件の矛盾をVBAで検知する「整合性チェック」エンジンの開発 – Project VBA解析バイブル

スポンサーリンク

Project VBAを掌握せよ:スケジュール矛盾を殲滅する「整合性チェックエンジン」の極致

プロジェクト管理において、MS ProjectのVBAによる制御は「地雷原の横断」に等しい。特にASAP(可能な限り早く)とALAP(可能な限り遅く)が混在する複雑な依存関係において、矛盾した制約条件は、ガントチャートを崩壊させ、再計算の無限ループを引き起こす。

本稿では、レガシー環境の制約を逆手に取り、メモリ消費を極限まで抑えた「整合性チェックエンジン」の設計思想と実装を伝授する。

—

1. なぜ「標準機能」では足りないのか

MS ProjectのUI上でのエラー検知は反応が遅く、大規模なWBS(作業分解構成図)では「どのリンクが、どの制約と衝突したのか」を特定するのに多大な工数を要する。我々が必要としているのは、GUIを介さずにメモリ空間上で依存関係グラフを走査し、論理的破綻をミリ秒単位で検知する「ヘッドレス・アナライザー」である。

2. エンジン設計の鉄則:メモリとオブジェクトのライフサイクル

VBAにおける最大の敵は、循環参照によるメモリリークと、巨大な`Task`オブジェクトの不適切なキャッシングだ。

  • オブジェクトの明示的解放: `Set obj = Nothing`を怠ることは、大規模プロジェクトにおける死を意味する。
  • Late Bindingの活用と限界: 開発時はEarly Bindingで補完を効かせ、デプロイ時はLate Bindingに切り替えることで、バージョン依存のリスクを排除する。
  • Windows APIの介入: パフォーマンス計測のために`QueryPerformanceCounter`を呼び出し、計算のボトルネックをミリ秒単位で可視化する。

—

3. 実装:矛盾検知エンジン(コアロジック)

以下のコードは、先行タスクの終了日と、自タスクの「開始制約日」が矛盾している箇所を抽出するエンジンの核となる。

Option Explicit

‘ パフォーマンス計測用API
Private Declare PtrSafe Function QueryPerformanceCounter Lib “kernel32” (lpPerformanceCount As Currency) As Long
Private Declare PtrSafe Function QueryPerformanceFrequency Lib “kernel32” (lpFrequency As Currency) As Long

Public Sub ValidateScheduleConsistency()
Dim proj As Project
Dim t As Task
Dim pred As Task
Dim errMsg As String

Set proj = ActiveProject

‘ 巨大なタスクリストを扱うため、画面更新を停止
Application.ScreenUpdating = False

On Error GoTo Cleanup

For Each t In proj.Tasks
If Not t Is Nothing Then
‘ 制約タイプが「開始日指定」系の場合の検証
If t.ConstraintType = pjMustStartOn Or t.ConstraintType = pjStartNoEarlierThan Then
For Each pred In t.PredecessorTasks
‘ 先行タスクの終了日が制約日より後ろにある場合、矛盾と判定
If pred.Finish > t.ConstraintDate Then
Debug.Print “矛盾検出: タスクID ” & t.ID & ” (” & t.Name & “)”
‘ ここにエラーログ出力処理を記述
End If
Next pred
End If
End If
Next t

Cleanup:
‘ オブジェクトの明示的解放(必須の作法)
Set pred = Nothing
Set t = Nothing
Set proj = Nothing
Application.ScreenUpdating = True
End Sub

—

4. シニアエンジニアのための極限チューニング

メモリ最適化の極意

`For Each`ループ内で`Task`オブジェクトを多用すると、VBAの内部ポインタが肥大化する。タスクID(数値)で管理し、必要な瞬間にのみ`Tasks(ID)`へアクセスするスタイルに変えるだけで、メモリ消費量は劇的に改善する。

レガシー環境との共存

もし貴殿がVB.NETで外部アドインを開発しているなら、`Interop.MSProject`経由でアクセスすることになるが、ガベージコレクションのタイミングには細心の注意を払え。`Marshal.ReleaseComObject`を徹底しなければ、巨大なガントチャートを開いたまま数時間でメモリが枯渇する。

5. 結び:エンジニアリングの誇り

スケジュール管理ツールとは単なる「入力箱」ではない。それはプロジェクトという生命体の「論理構造」そのものだ。制約条件の矛盾を放置することは、システムの整合性を放棄することと同義である。

このエンジンを貴殿のツールキットに組み込み、ガントチャートの「形だけの美しさ」ではなく、「論理の堅牢さ」を担保せよ。それが、システムを操る者に課せられた責務である。

—
追伸:もしこのコードを導入してパフォーマンスが改善しない場合は、計算オプションの「自動計算」を一時的にオフにしているか、`Application.Calculate`のタイミングを再考せよ。VBAの制御外でProject本体が再計算を始めると、整合性は永遠に保てない。

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