【入門編】先行タスクのUniqueIDをExcelから動的検索してリンクを張るマッピング手法 – Project VBA解析バイブル

スポンサーリンク

【Project VBA極意】先行タスクの「UniqueID」を制する!Excel連携による依存関係自動構築術

こんにちは。現場の泥臭い自動化から、システムアーキテクチャの設計までを渡り歩いてきたエンジニアです。

皆さんはMicrosoft Project(MSP)の自動化で、こんな壁にぶつかったことはありませんか?
「Excelで管理している先行タスクIDと、MSP上のUniqueIDが一致せず、リンクがめちゃくちゃになる…!」

これは、Project VBAを志す者が必ず一度は通る「魔の領域」です。今回は、この悩みを一撃で解決する、プロフェッショナルなマッピングロジックを伝授します。マクロの記録から脱却し、MSPの「心臓部」に触れる準備はいいですか?

1. なぜ「行番号」ではなく「UniqueID」なのか?

まず、基本のキを理解しましょう。MSPには2つのIDがあります。

  • ID(行番号): 今、画面で見えている順番。行を入れ替えると変わってしまう不安定な存在。
  • UniqueID: タスクが作成された瞬間に割り振られる「永久不変の通し番号」。

これこそが重要です。 依存関係(先行タスク)をプログラムで構築する際、ID(行番号)で指定するのは素人芸です。必ず、「Excel上の管理番号」を「MSPのUniqueID」に突き合わせてリンクを貼るという手順を踏む必要があります。

2. 実践!UniqueID検索&リンク設定ロジック

それでは、実務でそのまま使えるコードを見ていきましょう。このコードの肝は、「全タスクをスキャンして、対象のIDを持つタスクを高速で検索する(Find/Match)」というアプローチです。

Sub LinkTasksByUniqueID()
Dim proj As Project
Dim taskTarget As Task
Dim taskPredecessor As Task
Dim lngPredecessorUID As Long

Set proj = ActiveProject

‘ 例:ID 2のタスクに、UniqueID 5のタスクを先行タスクとして紐付ける場合
Set taskTarget = proj.Tasks(2) ‘ 対象タスクを取得
lngPredecessorUID = 5 ‘ Excelから取得した先行タスクのUniqueID

‘ 【重要】TaskオブジェクトをUIDから検索する関数を呼び出す
Set taskPredecessor = FindTaskByUniqueID(proj, lngPredecessorUID)

If Not taskPredecessor Is Nothing Then
‘ 依存関係を設定(fs = Finish-to-Start)
taskTarget.Predecessors = taskPredecessor.UniqueID & “FS”
Debug.Print “リンク成功: ” & taskTarget.Name & ” <- " & taskPredecessor.Name Else MsgBox "エラー:指定されたUniqueID " & lngPredecessorUID & " は存在しません。" End If End Sub ' 汎用関数:UniqueIDからTaskオブジェクトを取得する Function FindTaskByUniqueID(proj As Project, uid As Long) As Task Dim t As Task ' ループで回すのが最も確実。タスク数が多い場合はDictionary等にキャッシュすると高速化可 For Each t In proj.Tasks If Not t Is Nothing Then If t.UniqueID = uid Then Set FindTaskByUniqueID = t Exit Function End If End If Next t End Function ---

3. ここをクリアすれば一人前!陥りやすい罠

このコードを実装する際、初心者が必ずと言っていいほどハマるポイントが3つあります。

① `Nothing` のチェックを怠らない

MSPの `Tasks` コレクションには、削除されたタスクの残骸や、予期せぬ空白行が含まれることがあります。`For Each t In proj.Tasks` で回す際は、必ず `If Not t Is Nothing Then` を入れましょう。これがないと、アクセス違反でExcelもろとも強制終了します。

② 循環参照(Circular Reference)

プログラムでリンクを張る際、一番怖いのが「タスクAがタスクBを待ち、タスクBがタスクAを待つ」という循環参照です。MSPはこれを検知するとエラーを吐きます。大規模なリンク構築を行う場合は、リンクを張る前に「その依存関係が妥当か」を確認するロジックを前段に置くのが、真のエンジニアの流儀です。

③ パフォーマンスの重み

タスクが数千件ある場合、毎回 `For Each` で全件走査するのは非効率です。
プロの最適化: 最初に `Scripting.Dictionary` を使い、「UniqueID」をキー、「Taskオブジェクト」を値として格納する「ハッシュマップ」をメモリ上に構築してください。これだけで、検索速度は爆速になります。

4. 次のステップへ

「UniqueIDで紐付ける」というロジックをマスターしたあなたは、もうマクロの記録をポチポチ押すだけのユーザーではありません。

次は、Excel側のデータを読み込み、Dictionaryで高速化し、エラーハンドリング(例外処理)まで実装した堅牢なプロジェクト管理ツールへステップアップしましょう。

ここをクリアすれば、Project VBAの基本はバッチリです。現場の「面倒くさい」を「自動化」という魔法で解決する喜びを、ぜひ味わってください。

もし不明点があれば、いつでも聞いてくださいね。あなたの自動化の旅を、全力でサポートします!

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