【実務・中級編】Project VBAで「マイルストーン」を自動判定する:タスクの期間とフラグを連動させる自動化ツール – Project VBA解析バイブル

スポンサーリンク

プロジェクトの「形骸化」をコードで防ぐ:マイルストーン自動判定の最適解

現場のプロジェクトマネジメントにおいて、スケジュール表がただの「絵」になってしまう最大の原因は、「マイルストーンの定義が担当者任せになっていること」だ。

期間が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による自動化は、単なる楽をするための手段ではない。「プロジェクトの品質を定義し、それをシステムで強制する」ためのガバナンスツールである。

マイルストーンの判定をプログラムに委ねることで、メンバーは「マイルストーンの定義」という些末な判断から解放され、より本質的な「タスクの遂行」に集中できる。

さあ、あなたのプロジェクトから「不整合」という名のノイズを消し去ってくれ。技術とは、そのためにあるはずだ。

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