【Project VBA極意】ベースラインの「局所更新」を制する。全体適用という名の暴挙からの脱却
プロジェクト管理において、ベースラインは「聖域」であるべきだ。しかし、現場の現実は残酷だ。大規模なWBSの中で、特定のフェーズだけが遅延し、計画の微修正を余儀なくされる。
「プロジェクト全体を再ベースライン化して、過去の計画をすべて上書きする」
もしあなたがそんな運用をしているなら、今日でその習慣を捨ててほしい。それは、プロジェクトの履歴という資産を自ら破壊する行為に等しいからだ。今回は、Project VBAを駆使し、「特定のWBSレベル以下のみを対象としたベースラインの局所更新」という、実務で最も求められる堅牢な設計手法を伝授する。
—
1. なぜ「全体更新」が地雷なのか
MS Projectの標準機能である`BaselineSave`メソッドは強力だが、無慈悲だ。引数にプロジェクト全体を指定すれば、その瞬間にすべてのタスクの比較実績が書き換わる。
大規模プロジェクトにおいて、これは「トラッキングの崩壊」を意味する。一部の微調整のために、他の健全なフェーズの計画値まで上書きしてしまえば、どこが本来の計画で、どこが事後修正なのか、誰も追跡できなくなる。
我々エンジニアが目指すべきは、「必要な箇所だけを射抜き、安全に記録を残す」ことだ。
—
2. 実装のロジック:フィルタリングと対象抽出
この自動化において最も重要なのは、「対象外のタスクをどう扱うか」ではなく、「対象となるタスクのIDリストをいかに効率よく抽出し、そこだけにフラグを立てるか」というアプローチだ。
以下のコードは、指定したWBSレベル(OutlineLevel)以下のタスクのみをベースライン対象としてマークし、更新を行う極めて安全な設計である。
【プロダクションコード】局所ベースライン更新エンジン
‘ プロジェクトの特定の階層以下のみベースラインを更新する
Public Sub UpdateBaselineSelective(ByVal targetLevel As Integer)
Dim proj As Project
Dim tsk As Task
Set proj = ActiveProject
‘ 1. 安全装置: 全タスクのベースライン保存フラグを一度リセットする
‘ これを忘れると、前回の設定が残存し、意図せぬ箇所が更新される
For Each tsk In proj.Tasks
If Not tsk Is Nothing Then
tsk.BaselineSaved = False
End If
Next tsk
‘ 2. 対象タスクの選別
‘ WBSレベルが指定値以上のタスクのみフラグを立てる
For Each tsk In proj.Tasks
If Not tsk Is Nothing Then
‘ サマリータスクは除外するか、条件に応じて含めるか判断すること
If tsk.OutlineLevel >= targetLevel And Not tsk.Summary Then
tsk.BaselineSaved = True
End If
End If
Next tsk
‘ 3. 局所更新の実行
‘ Project.BaselineSaveの重要引数: AllSelectedTasks:=True を活用する
On Error GoTo ErrHandler
proj.BaselineSave SetAllTasks:=False, _
AllSelectedTasks:=True, _
CopyBaseline:=pjBaseline1, _
IntoBaseline:=pjBaseline1
MsgBox “ベースラインの局所更新が完了しました。”, vbInformation
Exit Sub
ErrHandler:
MsgBox “エラー発生: ” & Err.Description, vbCritical
End Sub
—
3. 実務で「事故らない」ための3つの鉄則
このコードをそのまま導入するだけでは不十分だ。真の自動化エンジニアは、以下の「守り」を実装に組み込む。
① 常に「コピー」から始める
`BaselineSave`を実行する際、いきなり本番のベースライン(`pjBaseline`)を上書きしてはいけない。まずは`pjBaseline1`〜`10`の予備枠を使い、検証プロセスを挟むこと。本番への適用は、その正当性が確認された後だ。
② WBSの構造変化を考慮する
WBSは生モノだ。タスクの追加・削除によって`OutlineLevel`は常に変動する。マクロを走らせる前に、必ずプロジェクトファイルが最新のスケジュールで保存されているか、チェックサムや更新日時を確認するロジックを前段に入れるべきだ。
③ データベース連携時の注意点
もしあなたがこのProjectをSQL Server等でエンタープライズ管理しているなら、VBA単体で更新を完結させてはならない。「いつ、誰が、どの階層のベースラインを更新したか」というログを別テーブルに書き出す、あるいはProjectの「メモ(Notes)」フィールドに更新履歴を自動追記する処理を併記すること。
—
結論:エンジニアの誇りを持って管理せよ
「ボタン一つで終わらせる」のは便利だが、何が起きているかブラックボックス化してはならない。今回紹介したコードは、「フラグを一度リセットし、対象を厳密に定義し、範囲指定で保存する」という、極めて透明性の高いプロセスだ。
この手法をマスターすれば、あなたはもう「プロジェクトの変更」に怯える必要はない。必要な場所だけをスマートに修正し、プロジェクトという巨大な船を、計画通りに、あるいは計画的に修正しながら目的地へと導くのだ。
さあ、コードを開け。あなたのプロジェクトを、あなたの手で正しく定義し直す時だ。
