【入門編】プロジェクト開始日変更に伴う全タスクの依存関係再計算の自動化 – Project VBA解析バイブル

スポンサーリンク

プロジェクト開始日変更の「絶望」を自動化で消し去る—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を掌握したエンジニアの姿です。

ここをクリアした君なら、もう次のステージが見えているはず。次はタスクの割り当てリソースを自動で調整するスクリプトに挑戦してみませんか?

応援していますよ。困ったことがあれば、またいつでも聞きに来てください。

タイトルとURLをコピーしました