Project VBAの深淵へ:UniqueIDで紐解く「依存関係」自動化の極意
こんにちは。現場で「手動作業の撲滅」を信条としている、業務自動化アーキテクトです。
Project VBAを触り始めた皆さんが次にぶつかる壁、それは「外部データ(CSV)からタスクの依存関係(先行タスク)をどう紐付けるか」という課題ではないでしょうか。
「ID」を使うと、タスクを並び替えた瞬間に崩壊する。だからといって、手動でリンクを貼るのは時間の無駄。そんな苦悩を解消するのが、今回解説する「UniqueIDをキーにしたDictionaryマッピング」という手法です。
この技をマスターすれば、あなたのプロジェクト管理は「作業」から「管理」へと進化します。さあ、一緒に深淵を覗いてみましょう。
—
1. なぜ「ID」ではなく「UniqueID」なのか?
まず、大前提の話をします。Projectには「ID」と「UniqueID」という2つの識別子があります。
- ID: タスクの現在の行番号。並び替えると変わってしまう、非常に不安定な数値です。
- UniqueID: タスクが作成された瞬間に割り当てられ、削除されるまで一生変わらない不変のIDです。
自動化の鉄則は「変わらないものをキーにする」こと。外部のCSVデータとProjectを紐付ける際は、必ずこの `UniqueID` を主キーとして扱いましょう。
—
2. アーキテクチャの全貌:Dictionaryという「高速検索エンジン」
数千行のタスクに対して、ループの中で `Find` や `Filter` を繰り返すと、Projectは重すぎてフリーズします。そこで登場するのが `Scripting.Dictionary` オブジェクトです。
これは「値(UniqueID)」を登録しておけば、「オブジェクト(Task)」を一瞬で取り出せる「連想配列」のようなもの。これを使うだけで、検索速度は数倍、いや数百倍に跳ね上がります。
実装コード:依存関係一括設定のロジック
以下は、CSVのデータ(先行タスクのUniqueID)を読み込み、Project上のタスクへリンクを反映させる実用的なコードです。
Sub LinkTasksByUniqueID()
Dim proj As Project
Dim tsk As Task
Dim dict As Object
Dim csvData As Variant ‘ ここでは簡略化のため配列として想定
Dim i As Long
Set proj = ActiveProject
Set dict = CreateObject(“Scripting.Dictionary”)
‘ 1. 【高速化の鍵】UniqueIDをキーにしてタスクオブジェクトを辞書に格納
For Each tsk In proj.Tasks
If Not tsk Is Nothing Then
dict.Add tsk.UniqueID, tsk
End If
Next tsk
‘ 2. CSVから読み込んだ依存関係を処理 (想定データ: 配列[対象UID, 先行UID])
‘ ※実際のCSV読み込み部分はFileSystemObject等で実装してください
csvData = Array(Array(10, 5), Array(11, 10)) ‘ サンプルデータ
For i = LBound(csvData) To UBound(csvData)
Dim targetUID As Long: targetUID = csvData(i)(0)
Dim predUID As Long: predUID = csvData(i)(1)
‘ 3. 辞書から該当タスクを瞬時に特定
If dict.Exists(targetUID) And dict.Exists(predUID) Then
‘ 先行タスクを設定 (TaskLinksコレクションに追加)
dict(targetUID).TaskLinks.Add dict(predUID)
End If
Next i
MsgBox “依存関係の構築が完了しました!”, vbInformation
End Sub
—
3. ここをクリアすれば一人前:陥りやすい罠
① 「タスクがNothing」問題
`For Each tsk In proj.Tasks` を実行すると、削除されたタスクの残骸などが「Nothing」として含まれることがあります。必ず `If Not tsk Is Nothing Then` でガードをかけましょう。
② 先行タスク設定の重複
すでにリンクが存在する場合、`TaskLinks.Add` を繰り返すとエラーになります。実運用では `dict(targetUID).TaskLinks.Count` を確認するか、エラーハンドリング(`On Error Resume Next` を適切に使う)を実装するのがプロの作法です。
—
4. アーキテクトからのアドバイス
VBAでProjectを操作する際、最も大切なのは「プロジェクトの整合性を壊さないこと」です。
依存関係を自動設定する際は、必ずバックアップをとるか、`Application.Calculation = pjManual` で再計算を一時停止してから実行し、最後に手動で計算させるようにしてください。これだけで、処理時間は劇的に短縮されます。
まとめ:今日からできること
1. UniqueIDを活用する: 行番号に依存しない設計を徹底する。
2. Dictionaryで検索を爆速化する: プログラムのループの中に検索ループを入れない。
3. エラーハンドリングを忘れない: 外部データには常に「存在しないID」が含まれている前提でコードを書く。
ここをクリアすれば、あなたはもうマクロ記録機能に頼る「初学者」ではありません。現場を動かす「自動化エンジニア」の入り口に立っています。
何か詰まったら、いつでも戻ってきてください。あなたの自動化の旅を、これからも応援しています。
