【入門編】【中級者向け】タスクの「UniqueID」と「ID」の混同を防ぐ!整合性を保ったリンク設定のロジック – Project VBA解析バイブル

スポンサーリンク

Project VBAの深淵へ:IDとUniqueIDを制する者が、スケジュール管理を制する

こんにちは。現場で「なぜかリンク先がずれる」「マクロを走らせるたびにタスク関係が崩壊する」という悪夢に悩まされていませんか?

Microsoft Project(MSP)の自動化において、多くのエンジニアが最初に突き当たる壁、それが「ID」と「UniqueID」の混同です。ここを理解せずして、堅牢なWBS(作業分解構成図)を構築することは不可能です。

今日は、Project VBAの極意として「整合性を保ったリンク設定」の設計パターンを伝授します。これさえ押さえれば、タスクの並び替えに怯える必要はもうありません。

1. なぜ「ID」だけでリンクしてはいけないのか?

まず、MSPの世界には2つの識別子があることを理解してください。

  • ID(行番号): 画面に表示されている順番。並び替えや挿入を行うと、瞬時に番号が変化します。
  • UniqueID(永続ID): タスクが作成された瞬間に割り振られ、削除されるまで決して変わらない「魂のID」。

「タスクA(ID: 3)の次にタスクB(ID: 4)をリンクさせる」というコードを書いても、ユーザーが途中でタスクを挿入してIDがずれた瞬間、あなたのプログラムは「全く別のタスク」にリンクを張ってしまうのです。

陥りやすいエラーの図解

[現状] ID:3(設計) -> ID:4(実装)
[ユーザー操作] ID:3と4の間に「要件定義」を挿入
[結果] ID:3(設計) -> ID:4(要件定義) ← 意図しないリンクが発生!

2. 整合性を保つための「UniqueID検索」パターン

リンクを設定する際は、必ずUniqueIDを基準にタスクを特定し、その上でIDを取得するというステップを踏むのが鉄則です。

以下に、実務でそのまま使える「安全なリンク作成関数」を紹介します。

実践的なリンク設定コード

‘ ———————————————————
‘ 指定したUniqueIDを持つタスクに対してリンクを張る関数
‘ ———————————————————
Sub CreateSafeLink(ByVal targetTask As Task, ByVal predecessorUniqueID As Long)
Dim proj As Project
Dim predTask As Task

Set proj = ActiveProject

‘ 1. UniqueIDからタスクオブジェクトを特定する(これが最大の安全策)
‘ .Tasks.UniqueID(ID) を使うことで、並び替えの影響を受けない
On Error Resume Next
Set predTask = proj.Tasks.UniqueID(predecessorUniqueID)
On Error GoTo 0

If predTask Is Nothing Then
MsgBox “UniqueID: ” & predecessorUniqueID & ” は存在しません。”
Exit Sub
End If

‘ 2. リンクの構築
‘ TaskLinks.Add メソッドは ID を要求するため、ここで初めてIDを呼び出す
targetTask.TaskLinks.Add Predecessor:=predTask

Debug.Print “リンク作成完了: ” & predTask.Name & ” -> ” & targetTask.Name
End Sub

3. コードの解説:なぜこれが最強なのか?

このコードには、伝説のアーキテクトが現場で磨き上げた「3つの知恵」が詰まっています。

1. `proj.Tasks.UniqueID(ID)` の活用:
MSPのオブジェクトモデルにおいて、`UniqueID`プロパティを引数に取れるこのメソッドは最強です。リスト内の位置に関係なく、対象をピンポイントで射抜きます。
2. `On Error Resume Next` による防衛:
万が一、先行タスクが削除されていた場合でも、マクロ全体がクラッシュするのを防ぎます。堅牢なシステムには、こうした「控えめなガード」が不可欠です。
3. リンク構築の最終段階でIDを使用:
`TaskLinks.Add` メソッドは引数として「ID」を要求します。ここで初めて、現在の正しいIDをMSPから動的に取得して渡すことで、常に最新の整合性を担保しているのです。

4. 今日から始める「ID依存症」からの脱却

初心者のうちは、ループ処理で `Tasks(i)` を回してリンクを張りたくなります。しかし、それは「砂上の楼閣」です。

設計のベストプラクティス:

  • タスクのIDを配列などで保持してはいけません。
  • 必ず `UniqueID` を保持し、処理の直前に `Tasks.UniqueID()` でオブジェクトを再取得する。
  • 「IDは一時的な表示名に過ぎない」と心に刻む。

ここをクリアすれば、あなたの書くVBAコードは一気にプロフェッショナルなレベルへと進化します。Project VBAは、オブジェクトのライフサイクルを深く理解した者にだけ、その真価を見せてくれるのです。

さあ、恐れずにコードを書き換えてみてください。あなたのスケジューリング自動化は、今日からもっと正確で、もっと自由なものになるはずです。


何か詰まった点があれば、いつでも聞いてくださいね。現場の壁を一つずつ、一緒に壊していきましょう。

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