【Project VBA】地獄の依存関係設定を自動化せよ:Predecessorsプロパティを掌握する極限の設計術
プロジェクトマネジメントにおいて、WBSの更新は「事務作業」ではない。それはプロジェクトの心臓部である。
しかし、MS Projectで何百ものタスクをマウスで手動リンクしている貴殿へ。その行為は、プロジェクトの遅延リスクを自ら高めているに等しい。なぜなら、「手作業による依存関係設定」は、必ずと言っていいほどミスを誘発するからだ。
今回は、Project VBAを用いてタスクの依存関係(Predecessors)をプログラムから制御する、実戦的な手法を伝授する。ただコードを動かすだけではない。「壊れない」設計思想をその手に刻んでほしい。
—
1. なぜ「手動」は罪なのか?
依存関係をVBAで制御するメリットは、単なる工数削減ではない。「ロジックの可視化」と「整合性の担保」にある。
手動設定では、タスクIDがずれた瞬間にプロジェクト全体が崩壊する。一方で、VBAでリンクを張れば、IDが変わろうと論理構造をコードで再定義できる。これが、大規模プロジェクトにおける真の「保守性」だ。
2. 核心:Predecessorsプロパティの仕様
MS Projectの `Task` オブジェクトには `Predecessors` プロパティが存在する。しかし、初心者が陥りやすい罠がある。
- 罠①:文字列連結だけで済まそうとする
`Task.Predecessors = “1,2”` のような書き方は、単一リンクなら良いが、複雑な依存関係(FS, SS, FFなど)が混在すると即座に破綻する。
- 罠②:IDの誤認
MS Projectにおける「ID」は行番号(可変)であり、「UniqueID」ではない。VBAで操作する際は、必ず `UniqueID` を基準にすべきだ。
—
3. 実践:堅牢なFSリンク生成スクリプト
以下に、実務でそのまま使える「堅牢なリンク生成関数」を提示する。エラーハンドリングを包含し、IDの不整合を未然に防ぐ設計だ。
‘ —————————————————————————
‘ @brief 特定の先行タスク(Predecessor)を後続タスク(Successor)にリンクさせる
‘ @param targetTask リンクを受けるタスクオブジェクト
‘ @param predecessorID 先行タスクのUniqueID
‘ @param linkType リンクタイプ (pjFinishToStart = 0, pjStartToStart = 1, …)
‘ —————————————————————————
Public Sub AddPredecessorRobust(ByRef targetTask As Task, _
ByVal predecessorID As Long, _
Optional ByVal linkType As PjTaskLinkType = pjFinishToStart)
On Error GoTo ErrorHandler
‘ NULLチェックと存在確認
If targetTask Is Nothing Then Exit Sub
‘ LinkTasksメソッドを使用する(これが最も安全でバグが出にくい)
‘ Predecessorsプロパティを直接文字列操作するよりも、APIとして提供されている
‘ LinkTasksメソッドを使うのが、Microsoftが推奨する「正しい」作法である。
ActiveProject.Tasks.UniqueID(predecessorID).LinkTasks _
Successor:=targetTask, _
LinkType:=linkType
Exit Sub
ErrorHandler:
Debug.Print “リンク設定エラー: タスクID ” & predecessorID & ” -> ” & targetTask.Name
Debug.Print “詳細: ” & Err.Description
End Sub
このコードの「賢さ」
1. `LinkTasks` メソッドの採用: `Predecessors` 文字列を解析させるのではなく、MS Projectの内部エンジンに直接命令を送るため、依存関係の循環参照や矛盾に強い。
2. `UniqueID` の採用: 行番号が変わっても、プロジェクト内のユニークなIDを追いかけるため、WBSの入れ替えに強い。
3. オプショナル引数: リンクタイプをデフォルトで「FS(終了-開始)」に設定しつつ、必要に応じてSS(開始-開始)等へ柔軟に変更できる拡張性を持たせている。
—
4. 現場で生き残るための設計思想
ファイル・DB連携時の注意点
Excelや外部DBからWBSを読み込んで自動リンクを構築する場合、「まず全タスクのUniqueIDをExcel側にマッピングしておく」ことが大原則だ。
1. インポート: Excelの行IDとMS Projectの `UniqueID` を突合する辞書オブジェクト(`Scripting.Dictionary`)をメモリ上に構築する。
2. 検証: `If Not dict.Exists(targetID) Then` で、存在しないIDへのリンクを防ぐ。
3. 反映: すべての検証が完了した後に、一気に `LinkTasks` を叩く。
この「検証→実行」の二段構えこそが、バグをゼロにするアーキテクトの流儀である。
—
最後に:貴殿が目指すべき場所
VBAでタスクを自動化できるようになると、貴殿は単なる「Projectユーザー」から「プロジェクトの自動化エンジニア」へ昇格する。
コードを書くときは、常に「このタスクが削除されたら、私のコードはどう振る舞うか?」を自問してほしい。例外を許容し、常に堅牢な状態へ復帰させる仕組みこそが、真に価値のある自動化ツールだ。
さあ、マウスを置いて、IDEに向かおう。プロジェクトの未来は、貴殿が書くその数行のコードにかかっている。
