【テクニカル・上級編】【中級者向け】タスクの「制約条件」と「依存関係」の競合を検知し、ログに出力する品質チェックツール – Project VBA解析バイブル

スポンサーリンク

プロジェクトの「見えない腐敗」を断つ:VBAによる依存関係と制約条件の論理整合性チェッカー

MS Project VBA(以下、P-VBA)の世界に足を踏み入れたエンジニアが、最終的に直面する壁。それはAPIの呼び出し方ではない。「プロジェクトのスケジューリングにおける論理的矛盾」という名の腐敗だ。

WBSが肥大化し、数千行を超えるタスクが管理される環境下で、「制約条件(Constraint)」と「依存関係(Dependency)」が引き起こす競合は、プロジェクトマネジメントの死を意味する。ツールが自動計算するガントチャートを盲信してはならない。

本稿では、レガシーなP-VBA環境において、論理的矛盾を検知し、エンジニアが即座に修正すべき箇所を特定する「品質チェックツール」の設計思想を伝授する。

—

1. なぜ「制約条件」はプロジェクトを破壊するのか

Projectにおける制約条件(`pjMustStartOn`等)は、本来「外部要因による絶対的な納期」を守るためにある。しかし、これが依存関係(リンク)と混在すると、Projectのエンジンは「論理的デッドロック」に陥る。

  • 競合パターン: 「先行タスク終了後に開始(FS)」という依存関係があるにもかかわらず、タスクに「開始日固定(Must Start On)」が設定されており、その日付が先行タスクの終了予定日と食い違っているケース。

この矛盾を放置すると、スケジューリングエンジンは「矛盾を無視して数値を表示する」か「パズルが崩壊して不自然な遅延が発生する」のどちらかを引き起こす。これを力技で修正するのではなく、VBAで「不整合箇所」をログとして吐き出させるのが、シニアエンジニアの流儀である。

2. 実装の核心:依存関係と制約の相関解析ロジック

以下に、不整合を検知しイミディエイトウィンドウにレポートするプロシージャを示す。メモリリークを防ぎ、大規模プロジェクトでも動作するよう、オブジェクトの明示的解放を徹底している。

‘ プロジェクトの論理整合性を検証するメインルーチン
Public Sub AuditTaskConstraints()
Dim proj As Project
Dim tsk As Task
Dim pred As TaskLink

Set proj = ActiveProject

‘ 画面更新を停止し、処理速度を極限まで高める
Application.ScreenUpdating = False

Debug.Print “— Audit Started: ” & Now & ” —”

For Each tsk In proj.Tasks
If Not tsk Is Nothing Then
‘ 完了済みタスクやサマリタスクをスキップする判定ロジック
If Not tsk.Summary Then
‘ 制約条件が設定されている場合のみ解析
If tsk.ConstraintType <> pjNoConstraint Then
CheckConflict tsk
End If
End If
End If
Next tsk

Application.ScreenUpdating = True
Debug.Print “— Audit Finished: ” & Now & ” —”

‘ オブジェクトの明示的解放
Set proj = Nothing
End Sub

‘ 競合検知のコアロジック
Private Sub CheckConflict(ByVal tsk As Task)
Dim link As TaskLink
Dim conflictFound As Boolean: conflictFound = False

‘ 依存関係(先行タスク)を走査
For Each link In tsk.Predecessors
‘ ここで「制約日付」と「先行タスクの終了日」の乖離を判定
‘ 厳密なロジックはプロジェクトの運用ルール(バッファ等)に合わせる
If tsk.ConstraintDate > link.FromTask.Finish Then
Debug.Print “Conflict Detected: ID ” & tsk.ID & ” [” & tsk.Name & “]”
Debug.Print ” -> ConstraintDate: ” & tsk.ConstraintDate
Debug.Print ” -> Predecessor Finish: ” & link.FromTask.Finish
conflictFound = True
End If
Next link
End Sub

3. チーフアーキテクトの視点:パフォーマンスと安定性の最適化

上記のコードを単なる「動くスクリプト」で終わらせないために、以下の点を遵守せよ。

  • 遅延バインディングの活用(要件による):

複数のバージョン(Project 2016/2019/365)が混在する環境下では、参照設定による「Missing」エラーを防ぐために、可能な限り遅延バインディングでの実装を推奨する。

  • メモリ解放の哲学:

VBAのガベージコレクションは信用に値しない。特に`Task`や`TaskLink`といった重いオブジェクトをループ内で扱う場合、`Set obj = Nothing`を徹底し、オブジェクト参照カウンタを常にクリーンに保つこと。これが数万タスクを抱える巨大MS Projectファイルでハングアップさせない唯一の手段だ。

  • Windows APIによるログの外部吐き出し:

コンソール出力だけではログが流れてしまう。`Win32API`の`WriteFile`を用いて、テキストファイルへ直接追記するログモジュールを別途作成し、システム管理者が後から検証できるようにしておくべきだ。

結論

プロジェクト管理は、ツールに依存するものではなく、ツールを御するエンジニアの「論理的整合性への執着」によって支えられる。

「制約条件」は、本来プロジェクトの防波堤であるべきだ。それが腐敗の元凶になっているのなら、VBAというメスを使って切り開くしかない。このツールを導入し、貴殿のプロジェクトから「見えない矛盾」を排除せよ。

システムは嘘をつかない。嘘をついているのは、常に整合性の取れていないデータである。

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