【入門編】依存関係のリンクタイプ(FS, SS, FF, SF)をVBAで一括変換する実務ツール – Project VBA解析バイブル

スポンサーリンク

プロジェクトの「運命」を書き換える:Project VBAで依存関係を自在に操る極意

こんにちは。現場で泥臭く、かつエレガントな自動化を追い求めている皆さんに、今日は「Microsoft Project VBA」の深淵に触れる一歩を授けましょう。

「計画変更で、全タスクの依存関係をFSからSSに変えなきゃいけない……手作業で100個もポチポチやるのか?」

そんな絶望的なシーンを、たった数秒で終わらせる。これが自動化エンジニアの腕の見せ所です。今回は、タスクのリンクタイプを一括変換するという、現場で最も「役に立つ」テクニックを伝授します。

1. なぜ「リンクタイプ」を操作するのか?

Projectにおける依存関係(Task Dependencies)は、タスク間の「時間的な縛り」です。

  • FS (Finish-to-Start): 前タスク終了後に次が始まる(標準)
  • SS (Start-to-Start): 前タスク開始後に次も始まる(並行作業の開始合わせ)
  • FF (Finish-to-Finish): 前タスク終了後に次も終了する(並行作業の終わり合わせ)
  • SF (Start-to-Finish): 前タスク開始後に次が終了する(稀なケース)

計画が遅延した際や、並行作業の割合を増やしたいとき、これらのタイプを一つずつ修正するのは非効率かつミスを誘発します。VBAを使えば、特定の条件に合致するリンクだけを、正確無比に書き換えることが可能です。

2. 依存関係を掌握するコードの全貌

まずは、アクティブなプロジェクト内の「すべてのリンク(先行タスク)」を調査し、リンクタイプを書き換えるツールを見てみましょう。

Sub BatchUpdateLinkType()
Dim tsk As Task
Dim pred As TaskPredecessor

‘ プロジェクト内の全タスクを走査する
For Each tsk In ActiveProject.Tasks
‘ タスクが空行でないか確認(重要:これがないとエラーの温床になります)
If Not tsk Is Nothing Then
‘ そのタスクが持つ全ての先行タスクをループ
For Each pred In tsk.TaskPredecessors

‘ もしリンクタイプが FS (pjFinishToStart) だったら SS に変更
‘ ※ ここを書き換えることで、FFやSFへの変換も自由自在です
If pred.LinkType = pjFinishToStart Then
pred.LinkType = pjStartToStart
End If

Next pred
End If
Next tsk

MsgBox “リンクタイプの一括変換が完了しました!”, vbInformation
End Sub

コードの要点解説

  • `TaskPredecessors` コレクション: タスクには必ず「先行タスク」というコレクションが存在します。ここをループで回すのが、依存関係を操作する唯一の正攻法です。
  • `pjFinishToStart` などの定数: Project VBAには、リンクタイプを表す組み込み定数が用意されています。これらを使うことで、コードの可読性が格段に上がります。
  • `If Not tsk Is Nothing` の守護: Projectのタスクリストには、削除された行や空白行が「Nothing」として潜んでいることがあります。これを無視するとプログラムは即座にクラッシュします。これはプロのエンジニアが必ず書く「防衛線」です。

3. 初学者が陥りやすい「落とし穴」

Project VBAを扱う上で、以下の2点は必ず覚えておいてください。

1. Undo(元に戻す)が効かない場合がある:
マクロによる操作は、通常の操作と異なり「元に戻す」ことができないケースが多いです。必ず実行前にプロジェクトファイルを別名保存してからテストしてください。
2. リンクは「双方向」を意識する:
今回のコードは「タスクの先行タスク」を操作しています。逆に「後続タスク」側からリンクを辿ることも可能ですが、どちらか一方を処理すれば依存関係は維持されます。両方いじろうとするとロジックが複雑化し、循環参照(ループ)を引き起こす原因になるので注意しましょう。

4. さあ、次のステップへ

このコードをマスターすれば、応用は無限大です。

  • 特定のタスク名だけを対象にする: `If tsk.Name Like “設計” Then …` と条件を追加する。
  • ラグタイム(遅延)も一括変更する: `pred.Lag = “2d”` のように書けば、依存関係のラグ(猶予)も一瞬で設定できます。

「自動化」とは、ただ楽をすることではありません。「人間がやるべき判断」に集中するための時間を、コードによって創り出すことです。

マクロの記録ボタンを押すだけでは辿り着けない、このオブジェクト指向の世界。ここをクリアしたあなたは、もう立派なProject VBA使いです。ぜひ、日々のプロジェクト管理でこのコードを役立ててくださいね。

困ったことがあれば、またいつでも聞きに来てください。応援していますよ!

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