【入門編】Taskの「先行タスク」をVBAで削除・追加し、クリティカルパスを最適化する – Project VBA解析バイブル

スポンサーリンク

Project VBAの深淵へ:先行タスクの「再接続」でクリティカルパスを操る技術

こんにちは。自動化の現場で血肉を削ってきた、君たちのガイド役です。

Project VBAを触り始めたばかりの君たちが、最初に直面する壁。それが「タスクの削除による依存関係の崩壊」です。手動でガントチャートをいじっていると、タスクを消した瞬間にスケジュールが崩れ、クリティカルパスが霧散する…あの絶望的な瞬間ですね。

今日は、マクロの記録という「安全圏」から一歩踏み出し、「依存関係を損なわずにタスクを抜き取る」という、プロのエンジニアが必須とするリンク操作アルゴリズムを授けます。

ここをマスターすれば、君のVBAスキルは「単なる自動化」から「プロジェクトの意思決定支援」へと進化します。

1. Projectオブジェクトモデルの「骨格」を理解する

まず、暗記すべきは階層構造です。

  • Application: MS Project本体。
  • Project: 開いているプロジェクトファイル。
  • Task: ここが戦場です。
  • TaskDependency: タスク間を結ぶ「絆(リンク)」。

タスクを削除するということは、そのタスクに繋がっている「TaskDependency」をすべて解除し、かつ「その前後のタスクを直接つなぎ直す」という外科手術を行う必要があります。

2. 先行タスク「再接続」のロジック

タスクA → 削除対象タスクB → タスクC という関係があるとき、タスクBを消すとAとCの繋がりが切れます。これを防ぐには、「タスクBを削除する前に、AとCを直接リンクさせる」という手順を踏みます。

実装コード:安全なタスク削除と再接続

このコードは、指定したタスクの「先行タスク」を「後続タスク」に引き継ぎ、安全に削除するプロシージャです。

Sub SafelyRemoveTask(targetTask As Task)
Dim pred As TaskDependency
Dim succ As TaskDependency
Dim proj As Project
Set proj = ActiveProject

‘ 1. 後続タスクが存在するか確認
For Each succ In targetTask.TaskDependencies
If succ.To = targetTask Then
‘ 2. 先行タスクをループで特定し、後続タスクへ接続
For Each pred In targetTask.PredecessorTasks
‘ 先行タスク(pred)と後続タスク(succ)を直接リンク
proj.TaskDependencies.Add From:=pred, To:=succ.To
Next pred
End If
Next succ

‘ 3. 全ての依存関係を断ち切ってから削除
targetTask.Delete
End Sub

3. このコードの「魂」:なぜこう書くのか?

初心者が陥りやすい罠が「TaskDependencyのコレクション操作」です。

  • 罠1:削除中の参照エラー

タスクを消すと、そのタスクに関連する`TaskDependency`オブジェクトは即座にメモリから解放されます。コレクションを回している最中に要素を削除すると、インデックスがずれてVBAはパニックを起こします。

  • 極意:順序がすべて

必ず「接続を作る(Add)」→「旧タスクを消す(Delete)」の順序を守ってください。先に消してはいけません。

4. クリティカルパス最適化への応用

このロジックを使えば、以下のような「高度な自動化」が可能になります。

  • 「バッファなしタスク」の自動短縮: 期間が0日のタスクを検知し、前後のリンクを維持したまま一括削除する。
  • 並行作業の直列化: 特定のリソースが過負荷な場合、タスクを一時的に繋ぎ変えて工期を後ろ倒しするシミュレーション。

プロからのアドバイス:エラーハンドリングの重要性

現場で動かす際、必ず以下のガードを入れてください。

If targetTask.ID = 1 Then
MsgBox “プロジェクト開始タスクは削除できません!”, vbCritical
Exit Sub
End If

Project VBAは、Excel VBAよりも「データの整合性」に厳しいです。一度リンクを壊すと復旧は困難です。まずは小さなテストファイルで、この「再接続ロジック」が意図通りに動くかを確かめてみてください。

最後に

「コードを書くこと」は「考え方を設計すること」と同義です。
タスクを削除する、という単純な行為の裏に、どれだけの依存関係が隠れているか。それを想像できるようになった君は、もう立派な自動化エンジニアです。

次は、タスクの「コスト」や「リソース負荷」をこのリンク操作と組み合わせて、自動スケジューリングの最適化エンジンを作ってみましょう。

何か詰まったら、いつでも聞いてください。君の挑戦を応援しています。

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