プロジェクト開始日変更の「絶望」を自動化で消し去る—Project VBA極限攻略
こんにちは。現場の最前線でVBAと格闘し続ける君へ。
「プロジェクトの開始日が1週間後ろ倒しになった」。この一言がどれほど現場を凍りつかせ、管理者を絶望させるか。Excelで管理していればコピペで済むことも、Microsoft Projectのタスク依存関係が絡むと、手作業での修正はまさに悪夢です。
今日は、「プロジェクト開始日の変更」というトリガーに対し、全タスクの依存関係を再計算してスケジュールを再構築するという、現場の「神ツール」の作り方を伝授します。マクロの記録ボタンを押し続けていた君が、今日から「設計者」へと進化する瞬間です。
—
1. なぜ「手作業」が地獄を生むのか?
MS Projectには強力なスケジューリングエンジンが備わっていますが、一度でも「日付の固定(制約条件)」を手動で入力してしまうと、そのタスクは自動計算のループから弾き出されます。
多くの初心者が陥る罠は、「とりあえず全部の日付をずらそうとする」こと。しかし、Project VBAの真髄は、日付を直接操作するのではなく、「制約条件をクリア(リセット)し、依存関係(リンク)に計算を任せる」という点にあります。
—
2. 実装コード:依存関係再構築エンジン
以下のコードは、全タスクの制約条件を「できるだけ早く(ASAP)」に戻し、プロジェクト開始日に合わせてスケジュールを再配置する心臓部です。
Sub RebuildScheduleFromStartDate()
‘ プロジェクト内の全タスクを再計算するプロシージャ
Dim tsk As Task
Dim proj As Project
Set proj = ActiveProject
‘ プロジェクト開始日を設定する(ここで日付を指定)
‘ ※日付形式はDate型で渡すのが確実です
proj.ProjectStart = #10/1/2023#
‘ 警告を抑制し、処理速度を高速化
Application.ScreenUpdating = False
For Each tsk In proj.Tasks
‘ 完了タスクやサマリータスクは除外するのが安全
If Not tsk Is Nothing Then
If Not tsk.Summary Then
‘ 重要:制約条件を「できるだけ早く」にリセット
‘ これにより、手動入力された日付を破棄し、リンクを優先させる
tsk.ConstraintType = pjAsSoonAsPossible
‘ もし特定のタスクで「固定」が必要なら、ここで条件分岐を入れる
End If
End If
Next tsk
‘ スケジュールを強制的に再計算
Application.CalculateAll
Application.ScreenUpdating = True
MsgBox “全タスクの依存関係に基づいたスケジュール再構築が完了しました!”, vbInformation
End Sub
—
3. コードの「魂」を解説する
このコードがなぜ強力なのか、3つのポイントを理解してください。
① `ConstraintType = pjAsSoonAsPossible`
これがこのツールの生命線です。ユーザーがうっかり日付を直接入力したタスクには「制約(Constraint)」が付きます。これを`pjAsSoonAsPossible`(できるだけ早く)に書き換えることで、Projectの計算エンジンに「あとはリンク(先行タスク)に従ってくれ!」と命令しているのです。
② `Application.ScreenUpdating = False`
初心者がやりがちな「画面をチラつかせながら1行ずつ処理する」のはパフォーマンスの敵です。描画を止めることで、処理速度は劇的に向上します。大規模なWBSでも一瞬で終わる理由はここにあります。
③ `Application.CalculateAll`
VBAで値を書き換えても、画面上の表示がすぐに反映されないことがあります。最後にこのメソッドを叩くことで、Projectの計算エンジンを強制的に起動させ、整合性を担保します。
—
4. 陥りやすいエラーと回避策
- 「タスクがNothingだった」エラー:
`For Each tsk In proj.Tasks` を回すと、稀に削除されたタスクの残骸がNothingとして取得されることがあります。必ず `If Not tsk Is Nothing Then` でガードしましょう。これができるだけで、中級者の仲間入りです。
- サマリータスクへの干渉:
サマリータスク(親タスク)の制約を直接いじると、配下の子タスクのスケジュールが崩壊することがあります。`If Not tsk.Summary Then` で、末端の作業タスクのみを操作するのが鉄則です。
—
最後に:エンジニアとしての一歩先へ
今回紹介したコードは、あくまで「最短で再計算する」ための基礎です。現場ではここから「特定の祝日を考慮したい」「特定のタスクだけは日付を固定したい」といった要望が出てくるはずです。
その時が来たとき、君はもう「記録ボタン」には頼らないはずです。オブジェクトモデルを調べ、プロパティを操作し、プロジェクトの時間を操る。それが、Project VBAを掌握したエンジニアの姿です。
ここをクリアした君なら、もう次のステージが見えているはず。次はタスクの割り当てリソースを自動で調整するスクリプトに挑戦してみませんか?
応援していますよ。困ったことがあれば、またいつでも聞きに来てください。
