【入門編】ASAP制約の罠:VBAでタスク開始日を強制固定する際の計算エンジン競合回避術 – Project VBA解析バイブル

スポンサーリンク

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を支配する強力なエンジンとなります。

ここをクリアしたあなたは、もう初心者ではありません。次の現場で、ぜひこの「停止と再開」の魔法を使ってみてください。応援していますよ。

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