納期から逆算せよ!Project VBAで実現する「ALAP制約」自動化エンジニアリング
こんにちは。Project VBAの世界へようこそ。
多くの人がProjectを「ただのガントチャート作成ツール」だと思っています。しかし、真のエンジニアにとって、Projectは「制約条件を解く数学的エンジン」です。
今日は、マクロの記録を卒業したあなたが、一歩先へ進むための「ALAP(As Late As Possible:可能な限り遅く)」制約をテーマにします。「納期」という絶対的なゴールから、タスクを逆算配置する。このロジックをマスターすれば、あなたのプロジェクト管理は「追われるもの」から「制御するもの」へ進化します。
—
1. なぜ「ALAP」なのか?—エンジニアの直感と逆算の美学
一般的なスケジュールは「今日から開始して、いつ終わるか」を計算します。しかし、実務では「納期(締切)は動かせない」という制約が先に来ることが多いですよね。
- ASAP(As Soon As Possible): 早く着手する。リスクヘッジにはなるが、リソースが分散しやすい。
- ALAP(As Late As Possible): 納期ギリギリまで着手しない。キャッシュフローやリソースの集中という観点で、非常に戦略的なスケジュール手法です。
この「ALAP」をVBAで制御することは、プロジェクトの「余裕(フロート)」を最大化し、無駄な先行着手を防ぐための極意なのです。
—
2. Project VBA:ALAP制御の核となるオブジェクト
Project VBAを操作する際、最も重要なのは「TaskオブジェクトのConstraintTypeプロパティ」です。
- 定数: `pjConstraintALAP`(値:0)
これに加えて、`ConstraintDate`(制約日)を適切に設定することで、Projectのスケジュールエンジンを強制的に「逆算モード」へ駆動させます。
—
3. 実装:納期逆算型スケジュール自動生成コード
では、実際にプロジェクト内の全タスクをALAP制約に切り替え、締切日を起点にスケジュールを再計算するコードを見てみましょう。
Sub ApplyALAPConstraintToAllTasks()
‘ プロジェクト内の全タスクをALAPに設定し、納期から逆算させる
Dim tsk As Task
Dim prj As Project
Set prj = ActiveProject
‘ 描画の更新を一時停止してパフォーマンスを向上させる
Application.ScreenUpdating = False
‘ 全タスクをループ処理
For Each tsk In prj.Tasks
‘ 概要タスク(親)はALAP設定による影響が大きすぎるため、除外するのが定石
If Not tsk Is Nothing And Not tsk.Summary Then
‘ 【重要】制約タイプを「できるだけ遅く (ALAP)」に設定
tsk.ConstraintType = pjConstraintALAP
‘ 必要に応じて、特定の締切日(Deadline)を設定
‘ ここでは例として、プロジェクトの終了日を締切に指定
tsk.Deadline = prj.ProjectFinish
‘ コメント:ここを通ることで、Projectエンジンは
‘ 「このタスクは納期までに完了させれば良い」と認識し、
‘ 自動的に開始日を後ろへズラす計算を行います。
End If
Next tsk
‘ 再計算を実行
Application.CalculateAll
Application.ScreenUpdating = True
MsgBox “全タスクのALAP制約適用が完了しました。納期から逆算されたスケジュールを確認してください。”
End Sub
このコードのポイント
- `tsk.Summary` の除外: 親タスク(サマリー)に無理やりALAPを適用すると、計算結果が予期せぬ挙動を起こすことがあります。あくまで「実作業(子タスク)」に適用するのが鉄則です。
- `Application.CalculateAll`: VBAでプロパティを変更した直後は、まだ計算エンジンが最新の状態ではない場合があります。必ず明示的に再計算を走らせましょう。
—
4. 陥りやすい罠:ここをクリアすれば「一人前」
初心者がよくハマるポイントを伝授します。これを知っているだけで、現場での評価が格段に上がります。
1. 「開始日」を手動でいじらない: ALAPを設定しているのに、セルで直接「開始日」を入力してはいけません。それは制約を強制的に上書き(ハード制約)してしまい、ALAPの自動計算を殺す行為です。「制約条件(Constraint)を変えれば、値は自動でついてくる」というVBAの思想を忘れないでください。
2. 依存関係(リンク)を忘れる: ALAPは「後続タスクがない場合、納期に合わせる」という挙動をします。先行タスクがある場合、その依存関係の鎖が優先されるため、期待通りに後ろにズレないことがあります。「先行タスクの終了」と「納期」のどちらが厳しいか、Projectは常に判断しているのです。
—
最後に:自動化の先にあるもの
「納期から逆算する」。これは単なるツールの操作ではありません。プロジェクトの「どこに余裕があるのか」「どこがボトルネックなのか」を可視化する行為です。
VBAでこれを自動化することで、あなたは「タスクを動かす作業」から解放され、「プロジェクトのボトルネックを特定する」という高次元のエンジニアリングに時間を割けるようになります。
ここをクリアしたあなたは、もうただのユーザーではありません。Projectを掌の上で転がす、立派な自動化エンジニアです。次のステップでは、このALAPとリソース負荷平準化を組み合わせた、より高度な最適化に挑戦してみてくださいね。
応援しています!
