【入門編】Shape.UniqueIDによる永続的トラッキング:ファイル再保存でもブレない図形の一元識別 – Visio VBA解析バイブル

スポンサーリンク

世の中の多くのエンジニアが、Visioの図形を扱う際に「Shape.ID」という罠に足を取られ、泥沼に沈んでいく姿を何度も見てきました。

「マクロで図形を特定したはずなのに、ファイルを保存して開き直したら別の図形を操作していた……」

もしあなたがそんな経験をしたことがあるなら、今日がその呪縛から解き放たれる日です。Visio VBAをマスターし、真に堅牢な自動化システムを構築するための「究極のパスポート」、それが `Shape.UniqueID` です。

なぜ「Shape.ID」を信じてはいけないのか?

Visioの `Shape.ID` は、あくまでそのページ内での「その瞬間の座席番号」に過ぎません。図形を削除したり、ページを並べ替えたり、あるいはファイルを再構築(コピー&ペースト)したりすれば、IDは容赦なく割り振られ直します。

外部のデータベースやExcelで管理している「製品ID」や「タスクID」と、Visioの「Shape.ID」を紐付けるのは、砂の上に城を建てるようなものなのです。

そこで登場するのが `Shape.UniqueID` です。これはVisioが図形に刻み込む「DNA(GUID)」です。ファイルがどう移動しようとも、コピーされようとも、この値だけは不変です。

現場で即戦力となる「GUID割り当て」の極意

まずは、図形にまだGUIDが割り当てられていない場合、強制的に生成して固定する処理から始めましょう。

実装コード:永続的IDの確保

‘ 選択中の図形に永続的なUniqueIDを割り当てる関数
Public Sub EnsureUniqueID(shp As Visio.Shape)
‘ 既にIDが存在するか確認(空文字なら未割り当て)
If shp.UniqueID(Visio.VisUniqueIDArgs.visGetOrMakeGUID) = “” Then
‘ ここで生成される
Debug.Print “新規GUID生成: ” & shp.UniqueID(Visio.VisUniqueIDArgs.visGetOrMakeGUID)
Else
Debug.Print “既存のGUIDを保持: ” & shp.UniqueID(Visio.VisUniqueIDArgs.visGetOrMakeGUID)
End If
End Sub

コードの解説

  • `visGetOrMakeGUID`: この引数が魔法の言葉です。「IDがあるならそれを返せ、なければ作れ」という、まさにエンジニアが欲する挙動を一行で実装します。
  • なぜこれが必要か: このコードを一度通すことで、その図形は「Visio上のただの四角」から「データベースと対話可能なエンティティ」へと進化します。

現場で「特定の図形」を呼び戻すための逆引き検索

IDを保存したなら、次はそれを使って図形を特定する技術が必要です。ページ内を総当たりでループするのはナンセンス。Visioには、GUIDから直接図形を射抜く強力なメソッドが用意されています。

実装コード:GUIDからShapeオブジェクトを特定する

Public Function GetShapeByGUID(pageObj As Visio.Page, guid As String) As Visio.Shape
Dim shp As Visio.Shape

‘ Page.ShapeIDsFromUniqueID を使うのが最速かつ安全
‘ 戻り値は配列なので、見つかった最初の要素を対象にする
Dim ids() As Long
ids = pageObj.ShapeIDsFromUniqueID(guid)

If UBound(ids) >= 0 Then
Set GetShapeByGUID = pageObj.Shapes.ItemFromID(ids(0))
Else
Set GetShapeByGUID = Nothing
End If
End Function

陥りやすい罠とエンジニアの心得

この実装において、初心者がよくハマるポイントが2つあります。

1. 「GUIDの重複」を恐れる:
手動でコピペを繰り返すとGUIDが重複するのでは?という懸念ですが、Visioはコピペ時にGUIDを複製するか、再生成するかを制御する仕組みを持っています。基本的には `visGetOrMakeGUID` を使っていれば、Visioの内部エンジンが整合性を守ってくれます。

2. 「グループ化」の罠:
グループ図形に対してGUIDを振ったあと、中身の構成を変えてもGUIDは維持されます。しかし、グループを解体(Ungroup)すると、親のGUIDは消失します。「永続性が必要なものは、グループ化して保持する」という設計思想を持つことが、システムを安定させる鍵です。

最後に:自動化の先にある世界へ

`Shape.UniqueID` を使いこなすということは、単にマクロを書くということではありません。「図面を単なる絵としてではなく、構造化されたデータとして扱う」という、アーキテクトの視点を持つということです。

ここをクリアすれば、あなたはもう「マクロ記録」の住人ではありません。Visioという巨大なオブジェクトモデルを自在に操り、現実世界の業務とデジタルデータを完璧に同期させる、真のオートメーション・エンジニアへの道を歩み始めたのです。

次はぜひ、このGUIDをExcelやSQL Serverと連携させてみてください。あなたのVisioファイルが、単なる図面から「生きている管理台帳」に変わる瞬間を、その目で確かめてくださいね。

応援しています。困ったときは、いつでもまたここに戻ってきてください。

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