【入門編】複雑な依存関係を持つタスク群を、VBAで一括削除する際の整合性維持 – Project VBA解析バイブル

スポンサーリンク

Project VBAの深淵へ:タスク削除の「負の連鎖」を断ち切るプロの作法

こんにちは。自動化の現場で血と汗とVBAを流してきた、あなたの技術メンターです。

Microsoft ProjectのVBAを触り始めると、誰もが一度は「タスクを削除したらスケジュールが崩壊した」という悪夢に遭遇します。手動なら簡単ですが、VBAで一気にタスクを消すと、依存関係(リンク)が宙に浮き、Projectの内部エンジンがパニックを起こすのです。

今日は、「依存関係を崩さずに、安全かつスマートにタスクを削除する」という、中級者への登竜門を攻略しましょう。ここを理解すれば、あなたの自動化スキルは格段に研ぎ澄まされます。

1. なぜタスク削除でスケジュールが崩れるのか?

Projectにおいて、タスクは「ただの行」ではありません。各タスクは`Task`オブジェクトとしてメモリ上に存在し、`TaskDependencies`(依存関係)という見えない鎖で繋がれています。

よくある悲劇のメカニズム:
1. タスクAとタスクBがリンクされている。
2. VBAでタスクAをいきなり `.Delete` する。
3. タスクBは「存在しないタスクA」を先行タスクとして参照し続けようとする。
4. 結果: リンク切れによる警告、あるいはスケジュールが強制的に現在日にリセットされる。

この「負の連鎖」を断ち切るには、「削除前にリンクを退避させ、削除後に再構築する」というアルゴリズム的アプローチが不可欠です。

2. 安全にタスクを削除するための設計図

以下のロジックでコードを組むのが、現場の「正解」です。

1. ターゲットの特定: 削除対象タスクのIDを保持する。
2. 依存関係の抽出: 削除対象に関連する先行・後続タスクをスキャンし、メモリに記録する。
3. 安全な削除: 依存関係を一度クリアしてから削除を実行する。
4. 依存の再構築: 記録しておいた情報をもとに、新しいタスク同士でリンクを繋ぎ直す。

3. 実践コード:依存関係を維持する安全な削除ルーチン

それでは、現場で即戦力となるコードを紹介します。まずは、特定のタスクを安全に消すための雛形です。

Sub SafeTaskDelete(targetTaskID As Long)
Dim proj As Project
Dim t As Task
Dim pred As TaskDependency
Dim pID As Long

Set proj = ActiveProject
Set t = proj.Tasks(targetTaskID)

‘ 1. このタスクを先行タスクとしている後続タスクの情報を一時保存するロジックが必要
‘ ここでは簡略化のため、削除前に先行タスクIDをログに取るイメージを示します
Debug.Print “削除対象タスク: ” & t.Name

‘ 2. 依存関係の解除(ここが重要!)
‘ TaskDependenciesコレクションをループして削除する
Do While t.TaskDependencies.Count > 0
t.TaskDependencies(1).Delete
Loop

‘ 3. タスクの削除
t.Delete

MsgBox “依存関係を整理してタスクを削除しました。”
End Sub

コードの解説:ここがポイント!

  • `Do While t.TaskDependencies.Count > 0`: `For Each`で削除するとインデックスがズレてエラーになることが多いです。`Count`が0になるまで最初の要素を消し続けるのが、VBAにおける安全なコレクション削除の鉄則です。
  • オブジェクトの生存期間: `t` という変数は削除した瞬間に無効になります。削除後に `t.Name` を参照しようとすると「オブジェクトが必要です」というエラーになるので、必ず「先に操作、後に削除」を徹底しましょう。

4. 陥りやすい「罠」を回避するアドバイス

初学者がよくやるミスは、「IDの変化」を考慮しないことです。

  • IDは生き物である: タスクを1行消すと、それ以下のタスクIDはすべて1つずつ繰り上がります。IDをループで回して削除する場合、必ず「下の行から上に向かって(Step -1)」ループさせてください。
  • 悪い例:`For i = 1 to 10` (上から消すとIDがズレてターゲットを見失う)
  • 良い例:`For i = 10 to 1 Step -1` (下から消せば、上のIDには影響を与えない)

最後に:自動化は「責任」を伴う

Project VBAは強力ですが、手動操作のような「やり直し(Ctrl+Z)」が効かないケースも多いです。

まずは必ずバックアップを取ること。そして、`Application.Calculation = pjManual` に設定して、計算エンジンを一時停止させてから大量削除を行い、最後に `Application.CalculateAll` で再計算させる。これが、大規模プロジェクトを扱うエンジニアの「たしなみ」です。

ここをクリアしたあなたは、もう「マクロ記録」に頼るだけの初心者ではありません。現場を動かす、真のProjectアーキテクトへの第一歩を踏み出しましたね。

何か不明点があれば、またいつでも聞いてください。あなたの自動化の旅を、全力でサポートします。

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