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

スポンサーリンク

プロジェクト管理の「揺らぎ」を排除する: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の深淵を渡り歩いてきた者たちが辿り着いた、クラッシュを防ぐための最後の知恵である。

結びに代えて

自動化とは、単にコードを書くことではない。システムが抱える「呼吸」を理解し、そのリズムに合わせてコードを流し込む作業である。今回紹介したマイルストーン同期ロジックは、貴殿のプロジェクト管理を次のステージへ引き上げる第一歩となるはずだ。

技術を愛する諸君、コードの美しさと、それが現場にもたらす静寂を追求し続けてほしい。その先にこそ、真のエンジニアリングが待っている。

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