【入門編】Taskの「ConstraintType」をVBAで一括変更し、スケジュールを柔軟に再計算させる – Project VBA解析バイブル

スポンサーリンク

プロジェクトの「時を操る」。Project VBAでTaskの制約を一括制御する極意

こんにちは。現場で泥臭い自動化を積み重ね、いつしか「Projectの守護神」と呼ばれるようになったエンジニアです。

Excel VBAは触ったことがあるけれど、Project VBAはなんだか難しそう……そう感じていませんか?実は、Projectのオブジェクトモデルは非常に論理的で、一度「階層構造」さえ理解してしまえば、Excelとは比較にならないほど強力な武器になります。

今回は、現場で最も重宝する「制約条件(ConstraintType)の一括変更」をテーマに、プロジェクトのスケジュールを自在に操るための極意を伝授します。

1. なぜ「制約条件」を理解する必要があるのか

Projectにおいて、Taskのスケジュールは「制約条件(ConstraintType)」によって定義されます。

  • ASAP(できるだけ早く): デフォルト。依存関係だけで動く。
  • Must Start On(指定日開始): 指定した日付に強制的に固定する。

プロジェクトの遅延リスクをシミュレーションする際、「もしこのタスクが予定通り始まらなかったら?」を検証するために、ASAPからMust Start Onに切り替えてガチガチに固定し、どこに負荷が集中するかを可視化する……これがプロの現場の知見です。これを手動で100回やるのは不可能です。VBAなら一瞬です。

2. Project VBAの心臓部:オブジェクトモデルを掴む

Project VBAは以下のピラミッド構造を意識してください。

1. Application: プロジェクト全体を包む空気のようなもの。
2. Project: 現在開いているファイル。
3. Task: プロジェクトを構成する最小単位(ここが今回のターゲット!)。

これらは全て「コレクション」として管理されています。つまり、`ActiveProject.Tasks` という箱の中に、すべてのTaskが詰め込まれているイメージです。

3. 実践:Taskの制約を一括変更する魔法のコード

以下のコードは、選択したタスク(または全タスク)の制約条件を「指定日開始(Must Start On)」に変更し、スケジュールを再計算させるものです。

Sub BatchChangeConstraintToMustStartOn()
Dim tsk As Task
Dim targetDate As Date

‘ 1. 日付設定:とりあえず今日の日付を基準にする
targetDate = Date

‘ 2. エラーハンドリング:タスクが一つもない場合を考慮
On Error Resume Next

‘ 3. ループ処理:ActiveProjectの全タスクを走査
For Each tsk In ActiveProject.Tasks
‘ サマリータスク(親タスク)は変更不可のため除外するのが定石
If Not tsk Is Nothing Then
If Not tsk.Summary Then
‘ 制約タイプを「指定日開始(pjMustStartOn)」に変更
tsk.ConstraintType = pjMustStartOn
‘ 制約日付をセット(現在の日付に固定)
tsk.ConstraintDate = targetDate
End If
End If
Next tsk

‘ 4. プロジェクトの再計算を強制的にトリガー
‘ Application.Calculate を呼ぶことで、依存関係を含めた再計算が走る
Application.Calculate

MsgBox “全タスクの制約を固定し、スケジュールを再計算しました。”, vbInformation
End Sub

このコードの「設計の肝」

  • `If Not tsk.Summary Then`: ここが一番重要です。サマリータスク(大項目)の制約を無理やり変えると、Projectのロジックが崩壊してスケジュールが真っ赤になります。サマリーはあくまで「集計結果」であるべきという原則を守ってください。
  • `Application.Calculate`: VBAで値を書き換えただけでは、画面上の計算が即座に反映されないことがあります。このメソッドを叩くことで、Projectの計算エンジンを強制的に回すのがプロの作法です。

4. 初心者が陥りやすい「3つの罠」

1. インデックスの勘違い:
ProjectのTaskは「1から始まる」連番です。0から始めるとエラーになります。`For Each` を使うのが最も安全で、バグを生みにくい書き方です。
2. 型指定の省略:
`Dim tsk As Task` と明示的に型を宣言してください。`As Object` で済ませると、IntelliSense(入力補完)が効かず、開発効率が劇的に落ちます。
3. Undo(元に戻す)の限界:
VBAによる変更は、「Ctrl+Z」で戻せません。テストは必ずバックアップを取ったファイルで行うこと。これが開発者の最低限のマナーです。

最後に:ここをクリアすれば、あなたはもう脱初心者です

いかがでしたか?「ただのループ」に見えるコードも、Projectの挙動(制約や再計算の仕組み)を知っているかどうかで、その価値は大きく変わります。

最初は、今回紹介したコードをコピーして、小さなプロジェクトで動かしてみてください。「自分の手でプロジェクトの時間を操っている」感覚が掴めれば、あとは応用次第。リソースの割り当てやコスト計算、進捗率の一括変更など、Project VBAの無限の可能性が広がっています。

分からないことがあれば、いつでもまた聞きに来てくださいね。あなたの業務が、VBAによってより知的で、より生産的なものになることを応援しています!

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