プロジェクト全タスクの「制約の呪縛」を解き放て:VBAによるWBS再配置の鉄則
プロジェクトマネジメントにおいて、スケジュール調整は最も神経をすり減らす作業の一つだ。特にMicrosoft ProjectのVBAを扱う際、多くのエンジニアが直面するのが「開始日固定(Must Start On)という名の呪縛」である。
「プロジェクトの開始日を1週間ずらしたのに、特定のタスクだけが過去の予定に固執して動かない」。こんな事態を招くのは、個々のタスクに不用意な制約(Constraint)が設定されているからだ。
今日は、場当たり的な手動修正を卒業し、VBAを用いてプロジェクトのライフサイクルを完全に掌握するための「制約解除と再配置」の極限ロジックを伝授する。
—
1. なぜ「手動修正」がプロジェクトを腐敗させるのか
MS Projectのタスクには `ConstraintType` というプロパティがある。これが `pjMSON`(Must Start On)などに設定されていると、親タスクやプロジェクト全体のスケジュール変更がトリガーされても、そのタスクは頑として動かない。
現場でよく見る「とりあえず個別に開始日をいじる」という行為は、依存関係(リンク)を断ち切り、スケジューリングエンジンを無効化する行為に等しい。我々が書くべきは、この「固定観念(制約)」をプログラムで一掃し、標準的な「ASAP(できるだけ早く)」に回帰させるためのスクリプトである。
—
2. 堅牢な再配置ロジックの設計思想
以下のコードを実装する際、以下の3つの鉄則を守ってほしい。
1. 制約の標準化: すべてのタスクを `pjASTN`(As Soon As Possible)へリセットする。
2. エラーハンドリング: `Task` オブジェクトのプロパティアクセス時に発生する「読み取り専用タスク(サマリータスクなど)」への干渉を排除する。
3. パフォーマンス: `Application.ScreenUpdating` を制御し、UIの再描画コストを最小化する。
—
3. プロダクションコード:制約解除と再配置エンジン
このコードは、モジュールとして切り出し、プロジェクトの計画変更時にいつでも呼び出せるようにしておくべきだ。
‘ プロジェクト全体の制約を解除し、開始日を強制再配置するプロシージャ
Public Sub ResetProjectSchedule(newProjectStartDate As Date)
Dim tsk As Task
Dim proj As Project
Set proj = ActiveProject
‘ パフォーマンス向上のため再描画を停止
Application.ScreenUpdating = False
On Error Resume Next ‘ 万が一のプロパティアクセスエラーを抑制
For Each tsk In proj.Tasks
If Not tsk Is Nothing Then
‘ 1. 制約を「できるだけ早く(ASAP)」にリセット
‘ これにより、依存関係に基づく自動計算が有効になる
tsk.ConstraintType = pjASTN
‘ 2. 制約日付をクリア(念のため)
tsk.ConstraintDate = “NA”
‘ 3. サマリータスク以外に対して開始日を再評価させる
‘ サマリータスクは子タスクの依存関係で自動算出されるべき
If Not tsk.Summary Then
‘ 必要に応じて特定タスクの調整ロジックをここに記述
End If
End If
Next tsk
‘ プロジェクト自体の開始日を更新
proj.ProjectStart = newProjectStartDate
‘ 最終的に再計算を強制
CalculateProject
Application.ScreenUpdating = True
MsgBox “全タスクの制約解除と再配置が完了しました。”, vbInformation
End Sub
—
4. 実装における「プロの注意点」
サマリータスクへの干渉を避ける
上記のコードで `If Not tsk.Summary Then` という条件分岐を入れているのは意図的だ。MS Projectにおいてサマリータスクの開始日は「子のタスクの最小開始日」に依存すべきであり、サマリータスク自体に制約をかけると、子タスクとの整合性が崩れ、計画全体が汚染される。
外部連携(Excel/DB)との同期
もしこのツールがExcelなどの外部データと連携しているなら、「制約の解除」を行った後に、必ず「依存関係(Predecessors)の再構築」を行うステップを挟むこと。制約を解除した瞬間にタスクが意図しない日付にジャンプするのは、リンクが正しく設定されていない証拠だ。
計算モードの確認
大規模なプロジェクトファイルでは、`Application.Calculation = pjManual` になっている場合がある。自動計算がオフのままでは、どれだけコードを実行しても日付は再計算されない。必要に応じて、実行前に `pjAutomatic` に切り替える制御を入れるのが確実だ。
—
最後に:エンジニアとしての矜持
VBAは単なる自動化ツールではない。プロジェクトの「構造的整合性」を担保するための設計ツールである。
「なぜこのタスクが動かないのか?」と悩む時間を1分でも減らすこと。そして、計画の変更というストレスフルな局面を、数秒のボタン操作で完了させること。それこそが、現場を支えるエンジニアの価値だ。
このコードをコピー&ペーストするだけでなく、あなたの現場のWBS構造に合わせて「サマリータスクの扱い」や「例外処理」をブラッシュアップしてほしい。その時、君は単なるプログラマーを超え、プロジェクトという名の巨大な生命体を操るアーキテクトになっているはずだ。
