プロジェクト管理の「揺らぎ」を排除する:MS Project VBAによるマイルストーン自動同期の極致
プロジェクトマネジメントにおいて、マイルストーンは単なる「点」ではない。それは進捗という名の波が押し寄せる防波堤であり、ステークホルダーとの信頼を維持するためのアンカーだ。しかし、現場のプロジェクトファイルを見れば、Durationが0日にも関わらずマイルストーンフラグがオフになっている、あるいはその逆といった「不整合」が散見される。
本稿では、MS Projectのオブジェクトモデルを深く解釈し、メモリの消費を最小限に抑えつつ、堅牢にタスク属性を同期させる自動化のアーキテクチャを提示する。
—
1. オブジェクトモデルの「歪み」を理解する
MS ProjectのVBAにおいて、`Task`オブジェクトへのアクセスは、単なるプロパティの読み書きではない。`Task.Duration`を操作すればProjectの計算エンジンが再計算(Recalculation)を試みる。数千行のタスクを抱える巨大なWBSで、ループ内で安易に値を書き換えれば、パフォーマンスは指数関数的に劣化する。
我々が目指すべきは、「イベントを抑制し、メモリを解放し、一撃で書き換える」ことだ。
核心となる戦略
- `Application.Calculation`の制御: ループ中は計算エンジンを停止させる。
- `Nothing`の徹底: オブジェクト変数の解放は、レガシー環境のメモリリークを塞ぐための作法。
- Late Bindingの回避: 実行速度と型安全性を重視し、参照設定を前提としたEarly Bindingを採用する。
—
2. 実装:高速同期エンジンの構築
以下のコードは、単なるマイルストーンのフラグ立てではない。期間が0日のタスクを強制的にマイルストーン化し、同時に視認性を高めるための書式設定までを射程に入れている。
Option Explicit
‘ 伝説的なアーキテクトによるマイルストーン同期エンジン
Public Sub SyncMilestoneFlags()
Dim proj As Project
Dim tsk As Task
Dim calcMode As Long
Set proj = ActiveProject
‘ 1. 計算エンジンの停止(パフォーマンス最適化の鉄則)
calcMode = Application.Calculation
Application.Calculation = pjManual
On Error GoTo Cleanup
‘ 2. タスクループ処理
For Each tsk In proj.Tasks
If Not tsk Is Nothing Then
‘ Durationが0かつMilestoneフラグが偽の場合
If tsk.Duration = 0 Then
If tsk.Milestone = False Then
tsk.Milestone = True
‘ 書式設定の自動適用(視認性向上)
tsk.FontColor = pjRed
tsk.FontBold = True
End If
Else
‘ 期間がある場合はフラグをオフにする
If tsk.Milestone = True Then
tsk.Milestone = False
tsk.FontColor = pjBlack
tsk.FontBold = False
End If
End If
End If
Next tsk
Cleanup:
‘ 3. 計算エンジンの復帰とメモリの明示的解放
Application.Calculation = calcMode
Set tsk = Nothing
Set proj = Nothing
If Err.Number <> 0 Then
MsgBox “エラー発生: ” & Err.Description, vbCritical
End If
End Sub
—
3. なぜ「手動計算(pjManual)」が必要なのか
一般的なエンジニアは、このコードを見て「`Calculation`を止める必要があるのか?」と問うだろう。答えはイエスだ。MS Projectは複雑な依存関係(Predecessor/Successor)を保持しており、各タスクを書き換えるたびに依存パスの再検証を行う。
数千件のタスクに対し、ループの都度再計算を走らせれば、OS側のスレッドを専有し、GUIのフリーズを招く。`pjManual`への切り替えは、単なる最適化ではなく、「システムを安定させ、論理の整合性を担保するための防波堤」である。
—
4. さらなる高みへ:システム間連携と外部API
このロジックを突き詰めると、次は「外部システム(SharePointやSQL Server)からの進捗同期」という課題にぶつかる。
もし、貴殿の環境でこの自動化ツールが外部DBと頻繁に通信を行うのであれば、`Windows API`の`Sleep`関数を用いて、Project側のプロセスがリソースを解放する隙間を作ってやる必要があるかもしれない。
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
大規模なバッチ処理を行う際は、数秒ごとに`DoEvents`を呼び出し、OSに制御を戻す。これが、長年VBAの深淵を渡り歩いてきた者たちが辿り着いた、クラッシュを防ぐための最後の知恵である。
結びに代えて
自動化とは、単にコードを書くことではない。システムが抱える「呼吸」を理解し、そのリズムに合わせてコードを流し込む作業である。今回紹介したマイルストーン同期ロジックは、貴殿のプロジェクト管理を次のステージへ引き上げる第一歩となるはずだ。
技術を愛する諸君、コードの美しさと、それが現場にもたらす静寂を追求し続けてほしい。その先にこそ、真のエンジニアリングが待っている。
