MS Project VBAの深淵へ:ASAP制約の罠と「計算エンジン」を支配する極意
こんにちは。Projectの自動化という荒野を切り拓くエンジニアの皆さん。
今日は、多くの開発者が「なぜかスケジュールが勝手に動く」「制約が反映されない」と頭を抱える「ASAP(できるだけ早く)制約の制御」という難所に切り込みます。
マクロの記録から一歩踏み出し、Projectの計算エンジンの「裏側」を理解すれば、あなたの自動化ツールは別次元の安定性を獲得します。さあ、深く潜っていきましょう。
—
1. なぜ「ASAP」はあなたの意図を裏切るのか?
Projectのタスクには「制約」という概念があります。特に`pjConstraintASAP`(できるだけ早く)は、デフォルトでありながら、実は非常に「お節介な」挙動をします。
「計算エンジン」という名の暴れ馬
Projectの計算エンジンは、タスクを操作するたびに「今の変更でスケジュール全体に矛盾はないか?」を即座に再計算します。
あなたがVBAで「Aタスクの開始日を今日にする」と指示しても、その直後に計算エンジンが「いや、先行タスクが明日まであるから、Aタスクは明日開始だね」と、あなたの命令を上書きしてしまうのです。これが、多くの人が遭遇する「ASAP制約の罠」の正体です。
—
2. 禁断の術:計算エンジンの「一時停止」
この競合を回避する唯一にして最強の手段は、「計算エンジンを一時停止させ、一括で更新し、最後に再計算させる」というプロトコルです。
これを怠ると、タスクが100個あるごとに100回再計算が走り、動作が重くなるだけでなく、内部的な不整合を引き起こすリスクがあります。
実践コード:安全にASAP制約を適用する
以下のコードは、計算エンジンを制御し、安全にASAP制約と開始日を適用するテンプレートです。
Sub ForceApplyASAPConstraint()
Dim tsk As Task
‘ 1. 計算エンジンを一時停止(手動計算モードへ)
‘ これにより、変更のたびに再計算が走るのを防ぎます
Application.Calculation = pjManual
On Error GoTo Cleanup ‘ エラーハンドリングはエンジニアの嗜み
For Each tsk In ActiveProject.Tasks
If Not tsk Is Nothing Then
‘ 制約をASAPに強制設定
tsk.ConstraintType = pjConstraintASAP
‘ 必要に応じて開始日をクリア(ASAP制約時は開始日を空にするのが定石)
‘ これにより計算エンジンが「制約に従って自動配置」する余地を与えます
tsk.Start = “NA”
End If
Next tsk
Cleanup:
‘ 2. 全ての処理が終わった後に、一括で再計算を実行
Application.Calculation = pjAutomatic
If Err.Number <> 0 Then
MsgBox “エラー発生: ” & Err.Description
Else
MsgBox “全タスクのASAP適用と再計算が完了しました。”
End If
End Sub
—
3. なぜ「Start = “NA”」なのか?
ここが本質です。多くの初心者は「ASAPに設定したのに、開始日が固定されたまま動かない」と悩みます。
`ConstraintType = pjConstraintASAP` を設定しても、タスクに「開始日(Start)」という値がハードコードされた状態で残っていると、Projectは「ASAP制約よりも、入力済みの開始日を優先する」という優先順位で動きます。
- ASAPを真に機能させるための秘訣:
- 制約を `pjConstraintASAP` にする。
- 開始日を `NA` (Not Applicable) にクリアする。
この2ステップをセットで行うことで、計算エンジンは初めて「よし、先行タスクの終了日に合わせて自動的に開始日を計算しよう」と納得して動いてくれるのです。
—
4. 最後に:エンジニアとしての一歩先へ
今回学んだ「計算エンジンの制御」は、Project VBAにおける「非同期的な挙動を同期的に管理する」という、非常に高度かつ実用的なテクニックです。
- 今日のまとめ
1. 再計算の嵐を防ぐため、`Application.Calculation = pjManual` で遮断する。
2. ASAP制約を適用する際は、必ず `Start = “NA”` で固定値を解除する。
3. 処理完了後に `pjAutomatic` に戻し、Projectに整合性を取らせる。
この手順を体に覚え込ませれば、もう「なぜかスケジュールが崩れる」という現象に振り回されることはありません。あなたの書くコードは、Projectを支配する強力なエンジンとなります。
ここをクリアしたあなたは、もう初心者ではありません。次の現場で、ぜひこの「停止と再開」の魔法を使ってみてください。応援していますよ。
