Project VBAの深淵へ:依存関係を超えた「スケジュールの絶対固定術」
こんにちは。プロジェクト管理の自動化という荒波を乗りこなそうとしている皆さん。
Project VBAの世界へようこそ。
多くのユーザーが「標準の依存関係(FS: 終了-開始)」を使いますが、現場では「先行タスクが終わったら、後続はどんな遅延があっても必ずこの日に開始させたい」という、システム標準の柔軟性(=勝手に動いてしまう特性)を逆手に取った制御が必要になる場面が多々あります。
今日は、Projectの甘い自動計算に依存せず、VBAで「強制的に日付をねじ込む」ための極意を伝授します。マクロの記録から一歩先へ、真のオートメーションの扉を開きましょう。
—
なぜ「標準機能」では不十分なのか?
Microsoft Projectの標準的な依存関係は「流動的」です。先行タスクが遅れれば後続も自動でスライドします。しかし、ビジネスの現場では「先行の終了をトリガーにしつつも、後続の開始日はカレンダー上の特定の日に固定したい(あるいは、先行の終了日を考慮しつつも、最短開始日をVBAで制御したい)」という「制約の強制」が求められます。
これを実現するには、`Task`オブジェクトのプロパティを直接操作し、「制約条件(ConstraintType)」をコードで制御する必要があります。
—
実装のコア:Taskオブジェクトを支配する
今回の目的は、「先行タスクの終了日を取得し、後続タスクの開始日を特定のルールで上書きする」ことです。
準備するもの:VBEの参照設定
ProjectのVBAエディタ(Alt + F11)を開き、`[ツール]` > `[参照設定]` で “Microsoft Project 16.0 Object Library”(バージョンは適宜)にチェックが入っていることを確認してください。これがなければ、Project専用のオブジェクトは呼び出せません。
実践コード:強制スケジュール更新エンジン
‘ 先行タスクの終了をトリガーに、後続タスクの開始を強制固定する
Sub ForceFixSuccessorStart()
Dim proj As Project
Dim tskPre As Task ‘ 先行タスク
Dim tskSub As Task ‘ 後続タスク
Dim targetDate As Date
Set proj = ActiveProject
‘ ここでは例としてIDを指定していますが、実際はループ処理で管理します
Set tskPre = proj.Tasks(1) ‘ 先行タスク(ID:1)
Set tskSub = proj.Tasks(2) ‘ 後続タスク(ID:2)
‘ 1. 先行タスクの終了日を基準にする
targetDate = tskPre.Finish
‘ 2. 後続タスクの制約を「指定日以降(Start No Earlier Than)」に設定
‘ これにより、Projectの自動計算による勝手な変動を防ぎます
tskSub.ConstraintType = pjMustStartOn
tskSub.ConstraintDate = targetDate
‘ 3. ユーザーへのフィードバック
Debug.Print “タスク「” & tskSub.Name & “」を ” & targetDate & ” に固定しました。”
End Sub
—
陥りやすいエラーと「知るべき鉄則」
初学者が必ず突き当たる「壁」を、先回りして解説します。
1. 「読み取り専用」の罠
Project VBAでは、タスクが「サマリータスク(親タスク)」である場合、その開始日や終了日は自動計算の結果であり、直接書き込むことはできません。書き込み対象が「末端のタスク(作業タスク)」であることを、`tskSub.Summary` プロパティで事前にチェックする習慣をつけてください。
2. `ConstraintType` の理解不足
`pjMustStartOn`(指定日開始)は強力ですが、あまりに多用するとスケジュールがガチガチに固まり、少しの遅延が「スケジュールの崩壊」を招きます。
- pjStartNoEarlierThan(指定日以降に開始):柔軟性を持たせたいならこちらが推奨です。
3. 計算の再実行(Recalc)
コードで値を書き換えた後、Projectが即座に再計算を行わないことがあります。大量のタスクを操作する場合は、最後に `Application.CalculateProject` を明示的に呼び出すことで、画面上のズレを防ぐことができます。
—
さあ、次はあなたの番です
今回紹介したコードは、あくまで「点」の制御です。これを応用すれば、「Excelの計画表からCSVを読み込み、数千のタスクを一括で固定する」といった高度なツールへと昇華できます。
「Projectは重い、操作しにくい」と嘆くのはもうやめましょう。VBAを知った今のあなたにとって、Projectはもはや受動的な管理ツールではなく、あなたの意志に従って動く強力なエンジンです。
まずはこのコードを、ダミーのプロジェクトファイルで動かしてみてください。そこから見える景色が変わるはずです。
何か壁にぶつかったら、またここへ戻ってきてください。エンジニアとしての旅路を、私はいつでも応援しています。
