プロジェクトの「依存関係」を掌握せよ!サマリータスクから全子タスクへリンクを連鎖させる極意
こんにちは。プロジェクト管理の現場で「なぜタスクのリンク設定はこんなに手間がかかるのか……」と頭を抱えたことはありませんか?
MS ProjectのGUIで一つずつ依存関係をポチポチ設定するのは、小規模ならまだしも、大規模なWBSでは時間の浪費であり、何より「設定漏れ」というヒューマンエラーの温床です。
今日は、Project VBAの真髄である「再帰的なオブジェクト操作」を用いて、サマリータスクにリンクを設定するだけで、その配下の全タスクへ自動的に依存関係を伝播させる「自動化ツール」の作り方を伝授します。
—
1. なぜ「サマリータスク」の依存関係が難しいのか
まず、MS Projectのデータ構造を理解しましょう。プロジェクトのタスクは「ツリー構造」です。
- サマリータスク: 複数のタスクを束ねる親(OutlineLevelを持つ)
- サブタスク: サマリーの中に含まれる子タスク
GUI上でサマリータスクにリンクを張ると、一見して全体の依存関係ができたように見えます。しかし、プログラム的に制御する場合、「親に依存関係を持たせても、子タスクには直接的な制約が課されない」というプロジェクトの仕様を理解しておく必要があります。
これを自動化で解決するには、「親のリンクを検知し、その情報を子タスクの先行タスク(Predecessors)へ再帰的に流し込む」というアルゴリズムが必要です。
—
2. 実装の設計図:再帰的アプローチ
今回作成するツールは、以下のステップで動作します。
1. 選択したタスク(サマリー)を特定する
2. そのサマリータスクが持っている先行タスク情報を取得する
3. サマリー内の全子タスクを走査する
4. 子タスクに対して、親と同じ先行タスクを設定する
ここでのポイントは、「子タスクを再帰的に探す」こと。サマリーの中にさらにサマリーがある場合でも、一番下の「実行タスク(リーフノード)」に辿り着くまで処理を繰り返す必要があるからです。
—
3. 実践:プロジェクト自動化コード
以下のコードをVBAエディタ(Alt + F11)に貼り付けてください。
‘ — プロジェクト・タスク依存関係の一括展開ツール —
Sub SyncDependenciesToSubtasks()
Dim selectedTask As Task
Dim parentTask As Task
Dim childTask As Task
‘ 選択中のタスクを取得
If ActiveSelection.Tasks.Count = 0 Then
MsgBox “対象となるサマリータスクを選択してください。”, vbExclamation
Exit Sub
End If
Set parentTask = ActiveSelection.Tasks(1)
‘ 親タスクの先行タスク情報を取得(必要に応じて複数対応も可能)
Dim predInfo As String
predInfo = parentTask.Predecessors
If predInfo = “” Then
MsgBox “親タスクに先行タスクが設定されていません。”
Exit Sub
End If
‘ サブタスクへ再帰的に反映
Call ApplyToChildren(parentTask, predInfo)
MsgBox “依存関係の同期が完了しました!”, vbInformation
End Sub
‘ 再帰的に子タスクを処理するプロシージャ
Sub ApplyToChildren(parent As Task, pred As String)
Dim t As Task
‘ 親タスクの直下にあるタスクをループ
For Each t In parent.OutlineChildren
‘ 先行タスクを上書き設定
t.Predecessors = pred
‘ もしその子タスクがさらにサマリーなら、孫へも再帰処理
If t.OutlineChildren.Count > 0 Then
Call ApplyToChildren(t, pred)
End If
Next t
End Sub
—
4. 知っておくべき「落とし穴」と対策
このコードを動かす際、以下の点に注意してください。
- 循環参照(Circular Reference):
親タスクが自分の子タスクに依存するように設定すると、プロジェクトの論理が破綻します。VBAで設定する前に、必ず「親と子の関係が論理的に正しいか」をチェックする条件分岐を入れるのがプロの流儀です。
- 計算の負荷:
数千行のWBSを一気に更新すると、プロジェクトの再計算(Calculation)が走ります。大規模な場合は `Application.Calculation = pjManual` に設定し、最後に再計算させることでパフォーマンスを劇的に向上させられます。
- 「マクロの記録」は使えない:
MS Projectの「マクロの記録」は、実はほとんどの操作を記録できません。今回のように `OutlineChildren` や `Predecessors` オブジェクトを直接操作する手法こそが、Project VBAを攻略する最短ルートです。
—
最後に:自動化は「あなたの時間」を奪うものではない
「コードを書く時間があるなら、手で設定した方が早い」……そう思う時期が誰にでもあります。しかし、一度この「再帰的構造」を理解してしまえば、あなたは単なる作業者から、プロジェクトの構造を設計するエンジニアに変わります。
最初は小さなタスクからで構いません。このコードをベースに、「特定のIDを持つタスクだけを対象にする」などのカスタマイズを加えてみてください。
ここをクリアすれば、あなたはもうProject VBAの初級者ではありません。次はどの自動化に挑みますか?応援しています。
