こんにちは。プロジェクトマネジメントの現場で、泥臭い手作業に追われていませんか?
「プロジェクト全体でベースラインを引くと、まだ確定していないタスクまで固定されてしまう……」
「特定のフェーズだけ進捗を可視化したいのに、なぜかプロジェクト全体が影響を受けてしまう……」
そんな悩みを抱えるあなたへ。今回は、Project VBAの真髄である「オブジェクトのフィルタリング」と「データ制御」を組み合わせた、実戦的なベースライン設定術を伝授します。
マクロの記録ボタンを押すだけの卒業証書を捨て、今日から「プロジェクトを操る側」へ一歩踏み出しましょう。
—
なぜ「全体」ではなく「部分」なのか
Projectにおける「ベースライン」とは、いわば計画の「凍結保存」です。しかし、大規模プロジェクトでは、全フェーズが一斉に固まることは稀です。
- 上流工程(要件定義)は確定 → ベースラインを引く
- 下流工程(開発・テスト)は流動的 → まだ引きたくない
この「柔軟性」こそが、Excel管理からProject管理へ移行した最大の恩恵です。今回は、「特定のWBSレベル(階層)以下のタスクだけを選択的にベースライン設定する」という、現場で最も重宝されるロジックを解説します。
—
現場で即戦力となるコード:特定階層以下のみベースライン保存
以下のコードをVBAエディタにコピーして、`TargetLevel`(階層)と`BaselineNumber`(0〜10)を調整してみてください。
Sub SetBaselineTargeted()
Dim t As Task
Dim targetLevel As Integer
Dim blNum As PjBaselineRestoration
‘ 設定する階層(例:WBSレベル3以下のタスクを対象にする)
targetLevel = 3
‘ ベースライン番号(0はベースライン0番、1は1番…)
blNum = pjBaseline
‘ プロジェクト内の全タスクを走査する
For Each t In ActiveProject.Tasks
‘ 行が空でないか、かつ、指定した階層以下のタスクかを確認
If Not t Is Nothing Then
If t.OutlineLevel >= targetLevel Then
‘ 重要:個別のタスクに対してのみベースラインを適用する
‘ プロジェクト全体へ適用するメソッド(BaselineSave)とは別物です
t.BaselineStart = t.Start
t.BaselineFinish = t.Finish
t.BaselineWork = t.Work
End If
End If
Next t
MsgBox “指定階層以下のベースライン設定が完了しました。”, vbInformation
End Sub
コードの解説:ここが「プロ」の視点
1. `For Each t In ActiveProject.Tasks`
Projectのタスク集合をイテレータで回します。`For i = 1 to ActiveProject.Tasks.Count`よりも、メモリ効率と安全性に優れた書き方です。
2. `If Not t Is Nothing`
ここがプロの罠です。ProjectのTasksコレクションには、削除された行の残骸や空行が含まれることがあります。このチェックを忘れると、実行時エラー1004でシステムが落ちます。
3. 直接代入の妙
通常、GUIで行う「ベースラインの保存」はプロジェクト全体に適用されます。しかし、VBAでは個々のタスクオブジェクトに直接値を書き込むことで、「本来の機能では不可能な部分的な変更」が可能になります。これがVBAを操る最大の醍醐味です。
—
陥りやすいエラーと回避策
1. 「なぜか全体が更新されてしまう」
GUIの「ベースラインの設定」ボタンを使ってマクロを組もうとすると、どうしても全体設定になってしまいます。ベースラインは「プロジェクト全体の設定」と「個別のタスク属性」の二階建てであることを意識してください。今回のように、各プロパティに値を直接渡すのが、制御の鉄則です。
2. パフォーマンスの低下
タスク数が数千件あるプロジェクトで、全件に対して書き込みを行うと画面がフリーズしたように見えます。そんな時は、コードの冒頭に以下を記述して「描画の更新」を止めてください。
Application.ScreenUpdating = False
‘ … 処理 …
Application.ScreenUpdating = True
これだけで、実行速度は劇的に向上します。
—
さあ、あなたのプロジェクトを制御下に
このマクロを理解できれば、あなたはもう「Projectの操作者」ではなく「Projectの設計者」です。
次に挑戦するなら、「特定のカスタムフィールド(例:フラグ項目)がTrueのタスクだけを対象にする」という条件分岐を追加してみてください。そうすれば、WBSレベルに関わらず、特定の重要タスク群だけをベースライン化する強力なツールに進化します。
「ここをクリアすれば、Project VBAの基本はバッチリですよ」。
何か不明点があれば、またいつでも聞いてください。あなたの自動化の旅を、全力でサポートします。
