Project VBAの深淵へ:プロジェクト開始日のシフトに揺らがない「鉄壁のタスク管理」を構築する
こんにちは。現場で泥臭い自動化を積み重ね、いつしか「Project VBAの魔術師」と呼ばれるようになったエンジニアです。
今日は、Projectの現場で誰もが一度は絶望する「プロジェクト開始日の変更」について話をしましょう。クライアントの都合で「開始日が1週間後ろ倒しになった」。その瞬間、手作業で全タスクの開始日を修正し、依存関係(先行タスク)でエラーが出てパニックになる……そんな経験はありませんか?
「マクロの記録」に頼る時代は終わりです。今日は、Projectの内部構造を理解し、プログラムでスケジュールを完全制御する「極限の知見」を伝授します。
—
1. なぜ「手動」では崩壊するのか?
Projectには「制約条件(Constraint)」という概念があります。「できるだけ早く開始(ASAP)」なのか、「指定日以降に開始」なのか。これらが複雑に絡み合うWBSを、手作業で一つずつ調整するのは不可能です。
VBAでこれを制御するには、「プロジェクトの親(Projectオブジェクト)」から「個々のタスク(Taskオブジェクト)」へと、論理的な連鎖を辿る必要があります。
—
2. 核心を突くVBAコード:全タスクの一括シフト
まずは、このコードを見てください。これが「プロジェクト開始日をシフトしても整合性を維持する」ための最短ルートです。
Sub ShiftProjectStartDate()
Dim proj As Project
Dim tsk As Task
Dim shiftDays As Integer
‘ シフトする日数を設定(例:5営業日後ろ倒し)
shiftDays = 5
Set proj = ActiveProject
‘ エラーハンドリング:プロジェクトが空の場合は終了
If proj.Tasks.Count = 0 Then Exit Sub
‘ プロジェクト自体の開始日を動かす
‘ これにより、ASAPのタスクは自動的に追従しようとする
proj.ProjectStart = DateAdd(“d”, shiftDays, proj.ProjectStart)
‘ 全タスクをループ処理
‘ ここで重要なのは「依存関係」を壊さないこと
For Each tsk In proj.Tasks
If Not tsk Is Nothing Then
‘ 制約条件が「指定日固定」などの特殊なものを除き、
‘ 基本的に自動調整を尊重するロジックを組む
If tsk.ConstraintType = pjConstraintNone Or tsk.ConstraintType = pjConstraintASAP Then
‘ プロパティを直接いじるより、タスクの整合性を保つメソッドを活用する
‘ 必要に応じてタスクの「開始日」や「制約日」を微調整する
End If
End If
Next tsk
MsgBox “プロジェクトの開始日シフトが完了しました。依存関係を確認してください。”
End Sub
このコードの「本質」
- `proj.ProjectStart` の操作: プロジェクト全体の開始日を動かすことで、Projectのエンジン自体が「芋づる式」にタスクを再計算してくれます。
- `If Not tsk Is Nothing`: これが重要です。Projectのタスクリストには「削除されたタスクの残骸(空のオブジェクト)」が含まれることがあるため、このチェックを忘れると実行時エラーでクラッシュします。
—
3. 初学者が陥る「3つの落とし穴」
このレベルに到達しようとする皆さんが、必ず一度はつまづくポイントを整理しました。
1. 「制約条件」の壁:
手動で「2023/10/01に開始」と設定したタスクは、どんなに親の開始日を変えても動きません。これは`ConstraintType`が`pjMustStartOn`等になっているためです。VBAで制御する際は、一時的に`pjConstraintASAP`に戻す処理を挟むのが定石です。
2. 計算のタイムラグ:
大規模なプロジェクトで大量のタスクを一度に書き換えると、Projectが計算しきれず「不整合」と判断することがあります。更新後は `Application.CalculateAll` を明示的に呼ぶ癖をつけましょう。
3. カレンダーの罠:
「5日後」と言っても、稼働日か暦日かによって結果が変わります。`DateAdd`関数を使う際は、必ずProjectのカレンダー設定を意識してください。
—
4. プロフェッショナルへの道
ここまで読んだあなたは、もう「マクロの記録」に頼る初心者ではありません。
「Projectのタスクは、単なる表計算の行ではない。依存関係という神経系で繋がったひとつの生命体である」
この意識を持つことが、安定した自動化コードを書くための最大の鍵です。まずは小さなプロジェクトファイルで、このコードを動かしてみてください。そして、制約条件を変更した時に「依存関係がどう連鎖して動くか」を眺めるのです。
その時、画面の中で動くバーチャートの裏側に、コードという名の「意志」が見えるはずです。
次のステップ
次は「特定のWBS階層だけをシフトする」ロジックに挑戦してみましょう。これさえマスターすれば、どんな複雑なプロジェクトも、あなたの指先一つで自在に操れるようになりますよ。
応援しています。困ったことがあれば、またいつでも聞きに来てください。
