【入門編】【中級者向け】CSVから読み込んだ依存関係を、タスクの「名前」をキーに動的マッピングしてリンクを張る – Project VBA解析バイブル

スポンサーリンク

プロジェクトを自動化せよ:タスク名で「依存関係」を自動構築する極限のVBAテクニック

こんにちは。現場で泥臭く、かつスマートな自動化を追求しているエンジニアです。

Project VBAを触り始めた皆さんが最初にぶつかる壁、それは「IDによる管理の限界」です。CSVからタスクを読み込むとき、「このタスクの先行タスクは?」と聞かれてIDを答えられる人は稀ですよね。大抵は「タスク名」でしか会話できません。

今日は、「IDが分からなくても、名前をキーにしてタスク同士をリンクさせる」という、実戦で最も重宝するテクニックを伝授します。ここをクリアすれば、あなたはもう「マクロの記録」に頼る初心者ではありません。

—

1. なぜ「名前」で紐付ける必要があるのか?

プロジェクト管理において、IDはシステム上の都合に過ぎません。人間が管理するのは「タスク名」です。
CSVに「先行タスク名」が書かれている状況で、いちいちIDを調べて書き換えるのは非効率の極み。

VBAの力で、「タスク名を検索し、見つかったらそのオブジェクトを特定し、リンクを張る」というプロセスを自動化します。

—

2. 依存関係構築のロジックを解剖する

この処理の肝は、以下の3ステップです。

1. タスク一覧をメモリ(辞書)に載せる: 全タスクをスキャンし、「名前」と「タスクID」を紐付けたリスト(Dictionaryオブジェクト)を作ります。
2. 先行タスクの検索: CSVから読み取った「先行タスク名」をキーにして、リストからID(またはTaskオブジェクト)を引きます。
3. リンクの構築: `Task.TaskDependencies.Add` メソッドを使って、物理的に線を繋ぎます。

—

3. 実践コード:タスク名でリンクを張る自動化スクリプト

このコードは、標準モジュールに貼り付けて使用してください。`Microsoft Project Object Library` への参照設定を忘れないように。

Sub BuildDependenciesByName()
Dim proj As Project
Dim tsk As Task
Dim dict As Object
Set dict = CreateObject(“Scripting.Dictionary”)

Set proj = ActiveProject

‘ 1. タスク名をキー、タスクオブジェクトを値としてDictionaryに格納
‘ これにより、検索速度が飛躍的に向上します
For Each tsk In proj.Tasks
If Not tsk Is Nothing Then
If Not dict.Exists(tsk.Name) Then
dict.Add tsk.Name, tsk
End If
End If
Next tsk

‘ 2. 依存関係の構築(例:先行タスク名が “設計” で、後続タスクが “実装” の場合)
Dim successorName As String, predecessorName As String

‘ 本来はCSVからループで取得する箇所です
successorName = “実装”
predecessorName = “設計”

‘ 3. リンクの構築
If dict.Exists(successorName) And dict.Exists(predecessorName) Then
Dim tskSuccessor As Task
Dim tskPredecessor As Task

Set tskSuccessor = dict(successorName)
Set tskPredecessor = dict(predecessorName)

‘ 依存関係を追加(LinkType 1は終了-開始関係)
tskSuccessor.TaskDependencies.Add Predecessor:=tskPredecessor, LinkType:=pjFinishToStart

Debug.Print successorName & ” に ” & predecessorName & ” をリンクしました。”
Else
MsgBox “タスクが見つかりません。名前を確認してください。”
End If
End Sub

—

4. 陥りやすい罠と解決策

① 「タスク名が重複している」問題

プロジェクト内で同じタスク名が複数あると、Dictionaryが混乱します。
解決策: タスクを一意に特定するための「WBS番号」や「ユニークID」をCSVに含め、名前と組み合わせてキーにしましょう。

② `TaskDependencies.Add` でエラーが出る

すでにリンクが存在する場合に再度追加しようとするとエラーになります。
解決策: リンクを追加する前に、`tskSuccessor.TaskDependencies` をループして、すでに同じ先行タスクが含まれていないかチェックする「重複回避」のガード節を入れましょう。

③ パフォーマンスの低下

タスクが数千件ある場合、毎回ループで検索するとプロジェクトがフリーズします。
解決策: 上記コードのように、一度 `Scripting.Dictionary` にキャッシュすることで、検索コストをO(n)からO(1)に激減させられます。これがプロの書き方です。

—

最後に:自動化の先にあるもの

このロジックをマスターすれば、Excelで書かれたWBSをCSVで書き出し、ボタン一つでProject上に完璧な依存関係図を構築できるようになります。

コードは単なる命令の羅列ではありません。「いかにしてコンピュータに人間の思考を理解させるか」という設計図です。今日学んだ「検索キーによる動的マッピング」を武器に、ぜひ明日からの業務を劇的に楽にしてください。

何か詰まったら、いつでも聞いてください。応援していますよ。

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