MS Project VBAの真髄:タスクの「依存関係」をコードで支配する
こんにちは。現場で泥臭い自動化を積み重ね、いつの間にかProjectの深淵まで到達してしまったエンジニアです。
「マクロの記録」ボタンを押しても何も起きない…それがMS Projectの現実です。Excelのように手軽ではないけれど、一度その制御方法を掴めば、数千行のWBSを一瞬で論理構築できる魔法のような力が手に入ります。
今回は、Project VBAにおける「タスクの依存関係(前提条件)」の自動設定について解説します。ここをマスターすれば、手動で線を繋ぐ作業からは永遠に解放されますよ。
—
1. なぜ「Predecessors」なのか
Projectにおけるタスクの依存関係は、`Task`オブジェクトの`Predecessors`プロパティが握っています。
初心者が陥りやすい誤解は、「UI上で見えるリンクを直接操作しようとする」ことですが、VBAでは「タスクAがタスクBを前提としている」という文字列(または参照)を放り込むという考え方をします。
基本の構文
‘ タスクIDを指定して依存関係を作る(ID: 2 が 1 を待つ、FS関係)
ActiveProject.Tasks(2).Predecessors = “1”
これだけで、タスク2はタスク1が終わるまで開始できない「終了-開始(FS)」の関係になります。シンプルでしょう?
—
2. 実践:依存関係を自動構築するスクリプト
それでは、より実務に近い形で、「タスクIDを順次指定して、階段状にリンクを張る」コードを見てみましょう。
Sub CreateSequentialLinks()
Dim tsk As Task
Dim i As Integer
‘ プロジェクト内の全タスクを走査する
For i = 2 To ActiveProject.Tasks.Count
‘ 現在のタスクを取得
Set tsk = ActiveProject.Tasks(i)
‘ 前のタスク(i-1)を前提条件として設定
‘ 文字列としてIDを渡すのがポイントです
tsk.Predecessors = i – 1
‘ デバッグ出力(イミディエイトウィンドウで確認用)
Debug.Print “タスク ” & tsk.Name & ” に ” & (i – 1) & ” をリンクしました”
Next i
MsgBox “依存関係の自動設定が完了しました!”, vbInformation
End Sub
コードのここがポイント!
- ActiveProject.Tasks(i): インデックス指定でタスクに直接アクセスしています。
- 文字列の暗黙変換: `Predecessors`プロパティは文字列を期待しますが、数値でも自動的に解釈してくれます。ただし、複雑なリンク(FS+2日など)を扱う際は必ず文字列で渡す癖をつけてください。
—
3. 初心者が陥りやすい「3つの罠」
現場でよく見る「動かない!」「エラーが出る!」という悲鳴。その原因のほとんどは以下のどれかです。
① 循環参照の発生
タスク2がタスク1を待ち、タスク1がタスク2を待つような設定をコードで行うと、Projectは即座にエラーを吐くか、計算を停止します。「依存関係は必ず一方向(過去から未来へ)」を鉄則にしてください。
② タスクIDの不整合
タスクを削除するとIDは飛び番になります。`ActiveProject.Tasks(i)`でループを回す際、IDが欠番だとエラーになります。実務ではIDではなく、ユニークな「UniqueID」を使うのがプロの常識です。
③ リンクの種類(FS以外)
デフォルトの「FS(終了-開始)」以外を設定したい場合は、文字列を工夫します。
- SS(開始-開始): `tsk.Predecessors = “1SS”`
- FF(終了-終了): `tsk.Predecessors = “1FF”`
- リード/ラグの追加: `tsk.Predecessors = “1FS+2d”` (終了後、2日待つ)
—
4. 次のステップへ:ここをクリアすれば「脱・初心者」
このコードが動いたら、次は「特定条件のタスクのみをリンクさせる」というロジックに挑戦してみてください。
例えば、「リソース名が『山田』のタスクだけを順番に繋ぐ」といった高度な自動化が可能になります。`If tsk.ResourceNames = “山田” Then …` といった条件分岐を入れるだけで、あなたのプロジェクト管理は劇的に効率化されます。
VBAは、あなたの思考をそのままProjectに投影する拡張現実のようなものです。恐れずにコードを書き換えて、自分だけの最強のツールに育て上げてください。
何か詰まったら、いつでも戻ってきてくださいね。あなたのエンジニアリングライフを応援しています!
