Project VBAを掌握せよ:ベースライン管理を自動化し、計画変更の「足跡」を支配する
プロジェクトマネジメントにおいて、ベースラインは「聖域」だ。しかし、現場では安易な上書きや、記録漏れによるトレース不可能な計画変更が横行している。
今回は、Project VBAを用いてベースラインの保存・クリア・ログ出力を体系化し、計画の変遷を確実に「資産」として残すための堅牢な実装手法を伝授する。ただコードを動かすのではない。プロジェクトのライフサイクルを制御するアーキテクチャを構築するのだ。
—
1. なぜ「手動」ではいけないのか:設計の哲学
Projectのベースライン機能は強力だが、UI経由の操作は「いつ、誰が、なぜ」変更したかというコンテキストを欠落させる。
- 非効率の極み: 「とりあえず保存」を繰り返した結果、どの時点が正式な承認ベースラインか不明になる。
- リスクの所在: ベースラインをクリアする際の誤操作は、過去のプロジェクト実績を永遠に失うことを意味する。
我々が目指すべきは、「ベースラインの操作には必ずログという影を伴わせる」という制約をコードレベルで強制することだ。
—
2. 実装の核心:ベースライン管理クラスの設計
VBAで実装する場合、標準モジュールに処理を垂れ流すのは悪手だ。今回は、ログ出力とベースライン操作をラップしたプロシージャを作成する。
堅牢なベースライン制御コード
以下のコードは、単に保存するだけでなく、外部テキストファイルにタイムスタンプと変更理由を記録する構造を持つ。
‘ ———————————————————
‘ プロジェクトベースライン管理モジュール
‘ 役割:ベースラインの保存・削除と監査ログの自動生成
‘ ———————————————————
Option Explicit
Public Sub SaveBaselineWithLog(ByVal reason As String)
Dim proj As Project
Set proj = ActiveProject
‘ 1. ベースラインの保存(pjBaselineSaveCurrent)
‘ 全タスクを対象に、既存の情報を保持しつつ保存
proj.BaselineSave AllSelectedTasks:=False, _
CopyBaselineToBaseline:=pjBaseline1, _
SaveData:=pjBaselineDataAll
‘ 2. 監査ログの書き出し
WriteBaselineLog proj.Name, “SAVED”, reason
MsgBox “ベースラインを正常に保存しました。”, vbInformation
End Sub
Private Sub WriteBaselineLog(ByVal projName As String, ByVal action As String, ByVal reason As String)
Dim logPath As String
Dim fNum As Integer
‘ ログファイルパス(環境に合わせて変更)
logPath = ThisWorkbook.Path & “\ProjectBaselineLog.txt”
fNum = FreeFile
‘ 追記モードでログを開く
Open logPath For Append As #fNum
Print #fNum, Now & ” | Project: ” & projName & ” | Action: ” & action & ” | Reason: ” & reason
Close #fNum
End Sub
—
3. 運用を成功させるための「3つの規律」
コードを書くだけでは、現場の運用は崩壊する。エンジニアとして、以下の制約をシステムに組み込むことを推奨する。
① ログファイルは必ず「共有フォルダ」に置け
ローカルPCにログを吐き出しても意味がない。プロジェクト関係者がアクセス可能なネットワークドライブ上に一元管理し、ExcelなどのBIツールで読み込めるCSV形式に拡張するのも良い。
② ベースラインの「ナンバリング」を強制する
`pjBaseline1`から`pjBaseline10`までをどう使うか、規約を決めること。
- `Baseline1`: 当初計画(Initial Plan)
- `Baseline2~`: フェーズ毎の再計画(Re-planning)
コード側で `BaselineSave` を呼び出す際、引数で動的にIDを指定させる設計にしておけば、運用ルールをシステム側で統制できる。
③ 「クリア」には強い警告(セーフガード)を実装せよ
ベースラインを削除する`BaselineClear`は、戻せない破壊的変更だ。VBAで実装する際は、必ずユーザーに「本当に削除して良いか」を問い、かつ実行前後のスナップショットを強制的にCSV出力するような「防御的プログラミング」を徹底すること。
—
4. アーキテクトからの提言:さらにその先へ
この実装に慣れたら、次は「差分比較の自動化」だ。
`Task.BaselineStart` と `Task.Start` を比較し、差異が一定以上のタスクをリストアップしてメール通知する……。ここまで自動化して初めて、プロジェクト管理は「監視」から「制御」へと進化する。
VBAは古臭いと言われることもあるが、プロジェクト管理におけるオブジェクトモデルへのアクセス権に関しては、今なお最強の武器だ。このコードをベースに、君たちのプロジェクトにおける「真実の記録」を自動化してほしい。
コードは嘘をつかない。だが、設計には魂を込めろ。 次回は、Taskオブジェクトのカスタムフィールドを活用した、より詳細な「進捗乖離の可視化ロジック」について深掘りしよう。
