プロジェクトの「形骸化」をコードで防ぐ:マイルストーン自動判定の最適解
現場のプロジェクトマネジメントにおいて、スケジュール表がただの「絵」になってしまう最大の原因は、「マイルストーンの定義が担当者任せになっていること」だ。
期間が0日なのにマイルストーンフラグが立っていないタスク、あるいはその逆。こうした小さな不整合が積み重なると、ガントチャートの可読性は失われ、進捗報告の精度は地に落ちる。
今回は、Project VBAを用いてこの「マイルストーンの不整合」を根絶し、ガントチャートの品質をシステム的に強制するアーキテクチャを伝授する。
—
1. なぜ「手動運用」が破綻するのか
多くの現場では、担当者に「0日ならマイルストーンにチェックを入れて」と指示しているはずだ。だが、エンジニアなら知っているはずだ。「人間の判断をプロセスに組み込むな」という鉄則を。
Project VBAを扱う上で意識すべきは、`Task`オブジェクトの`Duration`プロパティと`Flag`(または`Milestone`)プロパティの完全な同期だ。単に「0日=マイルストーン」と判定するだけでなく、UIの書式設定まで自動化することで、誰が触っても同じクオリティのスケジュール表が出力される状態を作る必要がある。
2. 堅牢な自動化エンジンの実装
以下は、現在のプロジェクト内の全タスクを走査し、期間が0日のタスクを強制的にマイルストーンとしてマークし、さらに視認性を高めるためのコードだ。
プロダクションコード:MilestoneSynchronizer
‘ ———————————————————
‘ Module: MilestoneManager
‘ Description: 期間が0日のタスクを自動的にマイルストーン化し、
‘ 視覚的に強調する堅牢な実装
‘ ———————————————————
Sub SynchronizeMilestones()
Dim tsk As Task
Dim proj As Project
Set proj = ActiveProject
‘ 予期せぬエラーを防ぐため、計算モードを一時的に制御する場合もあるが
‘ 今回はシンプルにタスク走査に集中する
On Error GoTo ErrorHandler
‘ プロジェクト内の全タスクをイテレーション
For Each tsk In proj.Tasks
If Not tsk Is Nothing Then
‘ 期間が0日であるか、またはマイルストーンとして定義されているか
If tsk.Duration = 0 Then
‘ 1. マイルストーンフラグを強制セット
tsk.Milestone = True
‘ 2. 特定のフラグフィールド(例: Flag1)を連動させる場合
tsk.Flag1 = True
‘ 3. 必要に応じてタスク名の色を変更するなどの装飾
‘ 注意: 大規模プロジェクトでループ内での書式変更は
‘ パフォーマンスに直結するため、条件分岐を最小化すること
Else
‘ 期間が0日ではないタスクのフラグ解除
If tsk.Milestone Then tsk.Milestone = False
End If
End If
Next tsk
MsgBox “マイルストーンの同期が完了しました。”, vbInformation
Exit Sub
ErrorHandler:
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical
End Sub
このコードの設計思想
- Nothing判定: `For Each`で取得するオブジェクトが空の場合(サマリータスクの階層構造などで稀に発生する)のガードを必ず入れること。
- 冪等性(べきとうせい)の確保: 何度実行しても同じ状態になるように設計している。これにより、定期実行タスクやボタン一つでの更新が安全に行える。
—
3. 実務でハマる「落とし穴」と回避策
A. パフォーマンスの罠
数千行規模のスケジュール表で、ループ内で `Font.Color` などを直接変更すると、画面描画が走り続け、処理が劇的に重くなる。「データ更新」と「書式設定」は分けるのが鉄則だ。書式設定が必要なら、Projectの「条件付き書式」機能(UI上の設定)とVBAのデータ更新を併用し、VBAではフラグの制御に徹するべきだ。
B. データベース連携時の注意
もし外部のDB(SQL ServerやSharePoint等)と連携させている場合、このVBAで書き換えたフラグが「手動更新」と見なされるか「自動計算」と見なされるかを意識せよ。`ActualStart`や`ActualFinish`との整合性が取れなくなり、Project側で「予定と実績の不整合」警告が大量発生する可能性がある。
C. 運用設計のヒント
このマクロを「ボタン」として配置するのも良いが、究極の自動化は`Project_BeforeSave`イベントにフックさせることだ。保存直前に自動的にマイルストーン判定が走るようにしておけば、マイルストーンがずれたまま報告される事故を物理的に防げる。
—
結論:自動化は「ルール」を強制するツールである
VBAによる自動化は、単なる楽をするための手段ではない。「プロジェクトの品質を定義し、それをシステムで強制する」ためのガバナンスツールである。
マイルストーンの判定をプログラムに委ねることで、メンバーは「マイルストーンの定義」という些末な判断から解放され、より本質的な「タスクの遂行」に集中できる。
さあ、あなたのプロジェクトから「不整合」という名のノイズを消し去ってくれ。技術とは、そのためにあるはずだ。
