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を自在に操るための基本にして極意です。まずは小さなプロジェクトファイルで試してみてください。その圧倒的な速さに、きっと驚くはずですよ。
さあ、次はどの部分を自動化しましょうか?あなたの挑戦を応援しています!
