Project VBAの深淵へ:特定のタスクグループだけに「ベースライン」を適用する極意
こんにちは。Project VBAの海へようこそ。
「マクロの記録」から一歩踏み出し、自身のロジックでプロジェクトを制御したいと願うあなたへ、今日は現場で即戦力となる「部分ベースライン更新」のテクニックを伝授します。
MS Projectの標準機能では、ベースラインは「プロジェクト全体」か「選択したタスク」という単位でしか保存できません。しかし、実務では「特定のフェーズだけ計画を見直したい」「特定のフラグが立ったタスクだけ中間計画を保存したい」というニーズが必ず発生します。
この壁を越えることで、あなたはプロジェクトの「時間」を自在に操る力を手に入れることになります。
—
なぜ「部分更新」が重要なのか?
通常、ベースラインを保存するコマンドはプロジェクト全体を書き換えてしまいます。しかし、大規模プロジェクトにおいて全タスクのベースラインを上書きするのは、過去の履歴を消すリスクを伴う危険な行為です。
今日解説するマクロを使えば、「特定のWBS階層」や「フラグ」に基づいて、ピンポイントでベースライン(中間計画)を保存できます。これにより、計画の「変化」を正確に記録し、精度の高い予実管理が可能になるのです。
—
今回のミッション:フラグをトリガーにベースラインを保存する
まずは、タスクの「フラグ1」が「はい」になっているタスクだけを対象に、ベースラインを保存するコードを見ていきましょう。
Sub SavePartialBaseline()
‘ Projectのオブジェクトを定義
Dim tsk As Task
‘ プロジェクト内の全タスクをループ処理
For Each tsk In ActiveProject.Tasks
‘ “フラグ1″がTrueのタスクのみを処理対象にする
If Not tsk Is Nothing Then
If tsk.Flag1 = True Then
‘ 特定のタスクのみベースラインを保存
‘ BaselineSave メソッド:
‘ SaveOption:=pjBaselineSaveSelected (選択範囲のみ)
‘ SetTo:=pjBaseline (ベースライン)
tsk.BaselineSave SaveOption:=pjBaselineSaveSelected, SetTo:=pjBaseline
End If
End If
Next tsk
MsgBox “フラグ1が設定されたタスクのベースライン更新が完了しました。”, vbInformation
End Sub
—
コードの重要ポイントを解剖する
このコードがなぜ「安全」で「強力」なのか、3つのポイントで解説します。
1. `For Each tsk In ActiveProject.Tasks`
- Project VBAの心臓部です。プロジェクト内のすべてのタスクオブジェクトを一つずつ手に取って確認します。`For i = 1 To …` と書くよりも、オブジェクト指向的にスマートで、メモリ効率も高い書き方です。
2. `If Not tsk Is Nothing`
- ここが重要です。 MS Projectのタスクは、削除されたりフィルタされたりすると「Nothing(空)」になることがあります。これを確認せずにプロパティにアクセスすると、実行時エラーでマクロが強制終了します。プロのコードには必須の防御策です。
3. `tsk.BaselineSave`
- `Project.BaselineSave` ではなく、`Task.BaselineSave` を呼んでいる点に注目してください。これが「選択されたタスクのみ」という部分更新を実現する鍵です。
—
陥りやすい罠:ここだけは気をつけろ!
初心者が最も苦しむのが、「ベースラインの種類(SetTo)」と「上書きのタイミング」です。
- ベースラインの種類: `pjBaseline`(基本計画)だけでなく、`pjBaseline1`〜`pjBaseline10`(中間計画)も指定可能です。複数の計画案を比較したい場合は、ここを書き換えて使い分けましょう。
- パフォーマンスの重み: タスク数が数千を超えるプロジェクトで、ループ内で都度保存を行うと処理が重くなります。もし動作が遅いと感じたら、`Application.ScreenUpdating = False` を先頭に入れ、処理後に `True` に戻すことで、画面描画を停止して高速化を図ってください。
—
次のステップ:さらなる自動化へ
このマクロをマスターしたら、次は「特定のアウトラインレベル(WBS階層)のみを抽出する」という条件を追加してみましょう。
‘ 例えば、階層レベル2のタスクのみを対象にする場合
If tsk.OutlineLevel = 2 Then
‘ ここにベースライン保存処理
End If
このコードを書き換えるだけで、あなたは「プロジェクトの特定の階層だけを定期的にスナップショットとして保存する」という高度な運用が可能になります。
最後に:エンジニアとして成長するために
Project VBAは、単に「手間を省く」ための道具ではありません。プロジェクトの状況を「データとしてどう可視化し、どう保存するか」という設計思想そのものです。
今日書いたコードは、あなたのプロジェクト管理の質を劇的に向上させるはずです。まずは自分の環境で、バックアップを取ったプロジェクトファイルに対して実行してみてください。
動いたときの感動こそが、エンジニアとしての第一歩です。困ったことがあれば、またいつでも聞きに来てください。応援していますよ!
