Project VBAを掌握せよ:計算エンジンを「強制再起動」させる極意
こんにちは。現場で泥臭く、かつエレガントな自動化を追求しているエンジニアです。
Project VBAを触り始めると、誰もが一度は直面する「壁」があります。それは、「コードで値を書き換えたのに、スケジュールやガントチャートに反映されない」という現象です。
実は、Projectの計算エンジンは、パフォーマンスを維持するために「必要最小限の計算しかしない」という非常に賢い(そして時には厄介な)仕組みを持っています。今日は、この計算エンジンを意図的に再起動させ、プロジェクトの整合性を保つための「禁断のテクニック」を伝授しましょう。
—
1. なぜ計算は「無視」されるのか?
Projectでタスクの開始日や期間を変更したとき、裏側では「ネットワーク図の再計算」という重い処理が走ります。しかし、VBAで大量のデータを一括処理している際、計算エンジンは「まだ計算の途中だから、今は反映しなくていいよね?」と判断して、計算を保留(またはスキップ)することがあります。
この結果、あなたのコードが終了した後に「数値がずれたままの古いスケジュール」が残るのです。これが「計算エンジンが更新を反映しない」という現象の正体です。
—
2. 魔法のメソッド:`Application.CalculateAll`
この膠着状態を打破するのが、`Application.CalculateAll` メソッドです。これは、プロジェクト全体に対して「今すぐ全ての依存関係を再計算しろ!」と命令する強制力を持ったトリガーです。
基本的な書き方
Sub ForceRecalculate()
‘ プロジェクト内の全ての計算を強制実行する
Application.CalculateAll
‘ これにより、VBAで変更した制約条件(ASAP/ALAP等)が
‘ ガントチャートや日付に正しく反映されます
MsgBox “計算エンジンを強制再起動しました。”
End Sub
—
3. 現場で生き残るための「鉄則」:副作用を防ぐ
ここで注意点です。`CalculateAll` は非常に強力ですが、大きなプロジェクトで何度も呼び出すと処理が極端に重くなります。以下に、現場で使える「プロの作法」をまとめました。
① 「計算の自動化」を一時的に止めるのが定石
大量のタスクを操作する際は、計算エンジンを一時的にOFFにし、最後に一括して `CalculateAll` を呼ぶのが、Project VBAの黄金パターンです。
Sub EfficientScheduleUpdate()
‘ 計算エンジンを一時停止(処理速度を劇的に向上させる)
Application.Calculation = pjManual
‘ — ここに大量のタスク更新処理を記述 —
Dim t As Task
For Each t In ActiveProject.Tasks
If Not t Is Nothing Then
t.Duration = “2d” ‘ 例えば期間を一括変更
End If
Next t
‘ ———————————-
‘ 最後に計算エンジンを再開し、強制再計算を実行
Application.Calculation = pjAutomatic
Application.CalculateAll
MsgBox “更新完了:計算エンジンを正常に同期しました”
End Sub
② 陥りやすいエラー:「読み取り専用」への罠
`CalculateAll` を実行する際、もしプロジェクトが「読み取り専用」で開かれていたり、排他制御でロックされている場合、エラーが発生することがあります。必ず `ActiveProject.ReadOnly` プロパティを確認するチェックを入れるのが、堅牢なシステムを作る第一歩です。
—
4. まとめ:ここをクリアすれば怖いものなし!
今回学んだ「計算エンジンの制御」は、Project VBAにおける「中級者への登竜門」です。
- 現象: コードで値をいじっても画面が変わらない。
- 原因: 計算エンジンが更新を保留している。
- 解決: `Application.CalculateAll` で強制再計算。
- 作法: 処理中は `pjManual` で止め、最後に `pjAutomatic` で再起動する。
このフローさえ守れば、スケジュール管理の自動化で迷うことはもうありません。皆さんのプロジェクトが、より正確で、より効率的なものになることを願っています。
分からないことがあれば、いつでもまた聞きに来てくださいね。一歩ずつ、確実にマスターしていきましょう!
