【入門編】プロジェクト開始日変更時の全タスク制約再計算をVBAで高速化するテクニック – Project VBA解析バイブル

スポンサーリンク

Project VBAの深淵へ:プロジェクト開始日変更時の「再計算地獄」を秒速で脱出する方法

こんにちは。業務自動化の最前線で戦う皆さん、プロジェクト管理の現場でこんな経験はありませんか?

「プロジェクトの開始日を1日ずらしただけなのに、Projectがフリーズしたように重くなる……」

これは、タスクのASAP(できるだけ早く)やALAP(できるだけ遅く)といった制約条件が、一つ変更されるたびに「連鎖的に再計算」されることが原因です。Projectというエンジンは、非常に優秀ですが、デフォルトの挙動のままでは、巨大なプロジェクトファイルほど「計算待ちの泥沼」にはまってしまいます。

今日は、この「再計算の連鎖」を制御し、VBAで魔法のように高速化する極意を伝授します。マクロの記録から一歩踏み出し、エンジニアの視点で「Projectの脳内」を操作してみましょう。

—

1. なぜプロジェクトの変更は重いのか?

Projectは、タスク間の依存関係や制約条件を常に監視しています。開始日をいじると、Projectは以下の処理を瞬時に行おうとします。

  • 依存関係の伝播: 「このタスクが動いたなら、後続タスクも動かさねば」
  • 制約条件の検証: 「このタスクはASAPだから、開始日をリセットして……」
  • グラフィックの再描画: 「ガントチャートを更新して……」

これを1タスクごとに繰り返すのが「デフォルトの挙動」です。1,000タスクあれば、1,000回以上の計算処理が走る。これではPCが悲鳴を上げるのも当然ですね。

2. 高速化の鍵:計算の「一時停止」

VBAエンジニアにとっての定石は、「計算を一度止めて、一括で更新し、最後に再計算させる」という手法です。

Project VBAには、計算モードを制御する `Calculation` プロパティが存在します。これを使いこなすのが、伝説のエンジニアへの第一歩です。

高速化を実現する魔法のコード

まずは、このコードを眺めてみてください。

Sub UpdateProjectStartDateFast()
Dim prj As Project
Set prj = ActiveProject

‘ 1. 計算モードを「手動」に変更し、計算の連鎖を止める
‘ これにより、変更のたびに再計算が走るのを防ぎます
Application.Calculation = pjManual

On Error GoTo ErrorHandler ‘ エラー発生時に計算モードを戻すための安全策

‘ 2. プロジェクト開始日を変更
‘ ここでの変更は、計算が走らないため一瞬で終わります
prj.ProjectStart = “2024/05/01”

‘ — ここにタスクの制約条件を変更する処理を記述 —
‘ 例: 特定のタスクの制約を解除したり、日付を調整したりする処理

‘ 3. 計算モードを「自動」に戻し、一括で再計算を実行
Application.Calculation = pjAutomatic

MsgBox “高速更新が完了しました!”, vbInformation
Exit Sub

ErrorHandler:
‘ 万が一エラーが起きても計算モードは戻すこと(重要!)
Application.Calculation = pjAutomatic
MsgBox “エラーが発生しました。計算モードを復旧しました。”
End Sub

3. このコードが「極限の知見」たる理由

初心者が陥りやすい罠は、「エラー発生時に計算モードが止まったままになること」です。これをやると、後続の操作がすべて正しく反映されなくなり、プロジェクトデータが破損するリスクすらあります。

  • `On Error GoTo` の活用: どんなに短い処理でも、計算モードを操作する際はエラーハンドラを必ず入れましょう。
  • `pjManual` の本質: このモードは、単に計算を止めるだけではありません。VBAが「今、何をすべきか」を制御するための「聖域」を作ることなのです。

4. 現場で役立つアドバイス

このテクニックを覚えると、あなたは「ただのVBAユーザー」から「Projectのエンジニア」へ進化します。

  • ステップアップ: 特定のタスクだけを更新したい場合は、`Task.ConstraintDate` や `Task.ConstraintType` を変更する前に `Calculation` を止め、最後に `Application.CalculateAll` を呼ぶというアプローチも非常に有効です。
  • 注意点: 計算を止めている間は、依存関係が一時的に矛盾した状態になります。計算を再開した瞬間にすべての整合性が取れるよう、ロジックを組むのが「プロの設計」です。

まとめ:ここをクリアすれば、もう怖くない

「Projectは重いものだ」と諦めていた時間は今日で終わりにしましょう。

1. `Application.Calculation = pjManual` で計算の連鎖を止める。
2. 必要な変更を一気に行う。
3. `Application.Calculation = pjAutomatic` で一気に再計算させる。

この「サンドイッチ戦法」こそ、Projectを自在に操るための基本にして極意です。まずは小さなプロジェクトファイルで試してみてください。その圧倒的な速さに、きっと驚くはずですよ。

さあ、次はどの部分を自動化しましょうか?あなたの挑戦を応援しています!

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