完遂への鉄の規律:Project VBAにおける「依存関係の凍結」と品質防壁の実装
Project VBAの深淵に足を踏み入れている諸君へ。
多くのエンジニアが「タスクの依存関係を自動化する」段階で満足するが、そこから先、真に堅牢なプロジェクト管理システムを構築できる者は一握りだ。プロジェクトが終盤に差し掛かると、誰かが誤操作で完了済タスクの先行タスクを書き換え、WBSの整合性が崩壊し、ガントチャートが歪む……そんな悪夢を見たことはないか?
今回は、「完了率(% Complete)が100%に達したタスクの依存関係(Predecessors)を物理的にロックし、改ざんを許さない」という、品質防壁の極限ロジックを伝授する。
—
1. なぜ「読み取り専用」が必要なのか
Projectのオブジェクトモデルにおいて、`Task.Predecessors`は非常に強力だが、同時に最も壊れやすい部分だ。VBAレベルでこれを制御するには、単なる「入力チェック」では足りない。
我々が実装すべきは、「イベントドリブンによるプロパティの強制ロールバック」だ。Projectの`ProjectBeforeTaskChange`イベントをフックし、変更が確定する前にメモリ上で検証し、不正な変更であれば即座に棄却する。これが、伝説的なシステムが備える「防壁」である。
—
2. 実装:`ProjectBeforeTaskChange` を用いたガードロジック
以下は、`ThisProject`モジュールに記述すべきコードの核だ。ここでは、オブジェクトの解放とメモリ効率を最優先し、冗長な変数を排除している。
‘ ————————————————————————–
‘ 対象:Task依存関係の保護(完了済タスクへの干渉防止)
‘ 制作者:チーフアーキテクト
‘ ————————————————————————–
Private Sub Project_ProjectBeforeTaskChange(ByVal tsk As Task, ByVal Field As PjField, ByVal NewVal As Variant, Cancel As Boolean)
‘ 1. パフォーマンス最適化:完了していないタスクなら即座に抜ける
If tsk.PercentComplete < 100 Then Exit Sub
' 2. 保護対象フィールドの特定
' Predecessors (pjTaskPredecessors) への変更を検知
If Field = pjTaskPredecessors Then
' 3. ユーザーへの警告と操作の棄却(メモリの保護)
MsgBox "警告:このタスクは完了済みであり、依存関係の変更は凍結されています。" & vbCrLf & _
"実績の整合性を保護するため、変更をキャンセルします。", vbCritical, "品質管理防壁"
Cancel = True
End If
' 4. オブジェクトの明示的解放(VBAのGCを待たせない)
Set tsk = Nothing
End Sub
---
3. 深層への考察:Windows APIと安定性の確保
大規模な企業プロジェクトでは、VBA単体では不安定な挙動を見せることがある。特にCOMスタックが重なる環境では、`Sleep` API等を用いてUIスレッドに呼吸させるのが定石だ。
もし大規模なバッチ処理で依存関係を自動設定する場合は、以下のAPIを導入して処理の安全性を高めることを推奨する。
‘ Kernel32を用いたスレッド制御(大規模処理の合間に挿入することでスタックオーバーフローを抑制)
If VBA7 Then
Private Declare PtrSafe Sub Sleep Lib “kernel32” (ByVal dwMilliseconds As Long)
Else
Private Declare Sub Sleep Lib “kernel32” (ByVal dwMilliseconds As Long)
End If
‘ 実行例:大量の依存関係更新時
‘ For i = 1 To TaskCount
‘ …処理…
‘ If i Mod 50 = 0 Then Sleep 10 ‘ 50タスクごとに10msの小休止
‘ Next i
—
4. シニアエンジニアへ贈る「設計の矜持」
このロジックを導入する際の注意点が一つある。「管理者権限のバイパス」だ。
システム管理者が修正を余儀なくされるケースは必ず存在する。そのため、環境変数や隠しフラグ(例:`CustomField1`に”SYSTEM_ADMIN”と入力されている場合はロック解除)を用意しておくのが、メンテナンス性を損なわないための「プロの作法」だ。
- 保守性への配慮: すべてのロジックはクラスモジュールにカプセル化し、メインのイベントプロシージャは「交通整理」のみを担当させること。
- レガシーとの共存: 古いProjectファイル形式(.mpp)と最新のProject Online環境で挙動が微妙に異なる場合がある。`Project.Version`を取得し、分岐処理を設けるのが、真に現場を知る者の戦い方だ。
—
最後に
技術とは、単に動けばいいものではない。
「後から来る者が、自分の書いたコードに呪われないようにする」。これこそが、アーキテクトの唯一の正義だ。
依存関係を凍結することは、プロジェクトの歴史を凍結することと同義だ。その重みを背負い、コードを実装せよ。諸君のプロジェクトが、揺るぎない品質の礎の上に築かれることを期待している。
―― 以上。現場に戻れ。
