Project VBAを掌握せよ:マイルストーンを「鉄壁」にする終了日固定制約の自動化術
現場のプロジェクトマネージャーから「計算エンジンが勝手にスケジュールを動かして困る」という嘆きを聞くたび、私は思う。それは、君たちがProjectのスケジュールエンジンを「野放し」にしているからだ。
Projectにおけるマイルストーンは、単なる通過点ではない。プロジェクトの命運を分かつ「アンカー(錨)」であるべきだ。計算エンジンの気まぐれに翻弄され、日付が漂流するような管理をしていては、進捗管理など絵に描いた餅に過ぎない。
今日は、VBAを用いてマイルストーンに「終了日固定(Must Finish On)」制約を強制的に付与し、スケジュールの安定性を担保する「職人仕様」のコードを授ける。
—
1. なぜ「手動設定」ではいけないのか
多くの現場では、マイルストーンの日付固定を手作業で行っている。しかし、タスク数が増大し、親プロジェクトとサブプロジェクトが複雑に絡み合う環境下では、以下のリスクが潜んでいる。
- 人為的ミス: 制約の種類(開始日固定か終了日固定か)を誤る。
- 整合性の欠如: 途中で追加されたマイルストーンに制約をかけ忘れ、計画全体が崩壊する。
- メンテナンスコスト: プロジェクト規模が拡大した際、全マイルストーンを追跡しきれない。
我々エンジニアが目指すべきは、「ルールをコードに落とし込み、人間が介在する余地を排除する」ことだ。
—
2. 堅牢な設計のためのアーキテクチャ
単に「制約をかける」だけでは、プロフェッショナルとは呼べない。以下の設計思想をコードに反映させる。
1. 特定フラグによる制御: 全タスクではなく、特定のフラグ(例:`Flag1`)がONになっているタスクのみを対象とする。これにより、制御範囲を完全にハンドリング可能にする。
2. エラーハンドリングの徹底: オブジェクトが存在しない、あるいはタスクが既に削除されている等の例外を捕捉する。
3. 計算エンジンの再計算: 制約付与後、即座に`CalculateAll`を呼び出し、整合性を再評価させる。
—
3. プロダクションコード:Milestone Anchor Tool
このスクリプトは、`Flag1`が`Yes`となっているタスクを検出し、その終了日を固定する。
‘ =================================================================
‘ Project VBA: マイルストーン終了日固定制約付与ツール
‘ 設計:Project自動化アーキテクト
‘ 概要:Flag1=Trueのタスクに対し「終了日固定」制約を強制付与する
‘ =================================================================
Sub SetMilestoneConstraintForcefully()
Dim tsk As Task
Dim proj As Project
Set proj = ActiveProject
‘ 計算負荷を下げるため、一時的に画面更新を停止
ScreenUpdating = False
On Error GoTo ErrorHandler
For Each tsk In proj.Tasks
‘ 完了済みタスクや、Flag1が設定されていないタスクは無視
If Not tsk Is Nothing Then
If tsk.Flag1 = True Then
‘ マイルストーン(期間0)かつ、Flag1がTrueの場合のみ実行
If tsk.Duration = 0 Then
‘ 制約タイプ:pjMSMustFinishOn (終了日固定)
‘ 制約日付:現在の終了日を維持
tsk.ConstraintType = pjMSMustFinishOn
tsk.ConstraintDate = tsk.Finish
Debug.Print “Fixed: ” & tsk.Name & ” at ” & tsk.Finish
End If
End If
End If
Next tsk
‘ 計算エンジンを再起動し、スケジュールを確定させる
CalculateAll
MsgBox “マイルストーンの固定処理が完了しました。”, vbInformation
GoTo ExitProc
ErrorHandler:
MsgBox “エラー発生: ” & Err.Description, vbCritical
ExitProc:
ScreenUpdating = True
End Sub
—
4. 運用上の注意点と「伝説の知見」
ファイル連携時の「罠」
このツールを大規模プロジェクトで運用する場合、「Baseline(基準計画)」との乖離に注意せよ。制約を付与した後にBaselineを再設定しないと、実績と計画の比較が機能しなくなる。制約付与を自動化するなら、必ず`BaselineSave`をセットで実行するパイプラインを構築しておくことだ。
計算エンジンへの負荷
`CalculateAll`は、プロジェクトの規模が数千タスクを超えると、重い処理となる。もしパフォーマンスに問題が出る場合は、特定のサマリータスク内でのみ再計算を行う手法へ切り替える必要がある。
保守性を高めるためのアドバイス
このコードをそのままコピペして終わりにするな。`Flag1`という名称は、運用上「Milestone_Lock」といったカスタムフィールド名に変更し、ユーザーが管理画面上で制御できるようにしておくべきだ。「コードのハードコーディングは、未来の自分への負債である」という言葉を忘れないでほしい。
—
最後に:エンジニアとしての誇り
自動化とは、単に工数を削減することではない。「プロジェクトの論理的整合性を、物理的に崩れないものにする」という規律をシステムに移植することだ。
君たちが作成するこの小さなスクリプトが、明日からのプロジェクト管理をより強固なものにすることを期待している。健闘を祈る。
