プロジェクトを自動化せよ:タスク名で「依存関係」を自動構築する極限の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上に完璧な依存関係図を構築できるようになります。
コードは単なる命令の羅列ではありません。「いかにしてコンピュータに人間の思考を理解させるか」という設計図です。今日学んだ「検索キーによる動的マッピング」を武器に、ぜひ明日からの業務を劇的に楽にしてください。
何か詰まったら、いつでも聞いてください。応援していますよ。
