【入門編】【中級者向け】CSVファイルから読み込んだ依存関係を、タスクの「UniqueID」をキーに一括反映させる – Project VBA解析バイブル

スポンサーリンク

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」が含まれている前提でコードを書く。

ここをクリアすれば、あなたはもうマクロ記録機能に頼る「初学者」ではありません。現場を動かす「自動化エンジニア」の入り口に立っています。

何か詰まったら、いつでも戻ってきてください。あなたの自動化の旅を、これからも応援しています。

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