【入門編】【初心者】Shape.IDとShape.Nameの決定的な違い:図形を特定する際の「名前が変わる」リスクを回避する – Visio VBA解析バイブル

スポンサーリンク

Visio VBAの「図形特定」で一生迷わないための鉄則:Shape.IDとShape.Nameの決定的な違い

こんにちは。業務自動化の世界へようこそ。
Visioのマクロを書き始めると、必ず一度はぶつかる壁があります。それは「狙った図形をどうやって確実に捕まえるか」という問題です。

「`ActivePage.Shapes(“プロセス.1”)` と書いたのに、なぜかエラーになる」
「図形をコピーしたら、名前が変わってしまってコードが動かなくなった」

そんな悩みを持つあなたへ。今日はVisio VBAにおける「図形特定」の極意を伝授します。ここを理解すれば、あなたのマクロは一気に「安定したプロのツール」へと進化します。

1. なぜ「名前」だけではダメなのか?

Visioの画面上で図形を選択すると、ウィンドウに「プロセス.1」や「長方形.5」といった名前が表示されますよね。初心者の方はまず、「この名前を使えば図形を特定できる!」と考えがちです。

しかし、これが最大の罠です。

Shape.Nameの儚い運命

Visioにおいて`Shape.Name`は、「現在の文脈における識別子」に過ぎません。

  • コピー&ペースト: 同じ図形をコピーすると、Visioは自動的に名前の末尾に数字を振ります(例:`プロセス.1` → `プロセス.2`)。
  • 削除と再作成: 図形を削除して新しく作成すると、名前がリセットされたり、別の名前が割り当てられたりします。

つまり、`Shape.Name`は「人間が見てわかりやすい」というメリットがある反面、「プログラムが信頼して参照し続けるにはあまりに不安定」なのです。

2. Shape.ID:それはVisioが唯一認める「戸籍番号」

一方で、`Shape.ID`はどうでしょうか。これはVisioがそのページ内の図形に対して発行する、ユニークな(重複しない)管理番号です。

  • ページ内での一意性: そのページにおいて、IDが重複することは絶対にありません。
  • 堅牢性: 名前が変わろうと、図形が移動しようと、そのページ内に存在する限りIDは変わりません。

ただし、一点だけ注意が必要です。
図形を削除すると、そのIDは欠番になります。また、新しい図形を作ると、その時点での空いている最小のIDが割り当てられます。つまり、「ID 1番は永遠に最初の図形である」という保証はありません。

3. 実践!堅牢な図形参照コードの書き方

では、どうすれば良いのでしょうか?
もっとも賢いアプローチは、「名前やIDに頼り切らず、メタデータや命名規則を活用する」ことです。

以下のコードを見てください。これは、特定の「役割」を持つ図形を確実に特定するための、現場で使えるプロの書き方です。

Sub GetTargetShapeSafely()
Dim pg As Visio.Page
Dim shp As Visio.Shape

Set pg = ActivePage

‘ 【推奨】名前で探す場合は、あらかじめ「名前」を自分で定義する
‘ [開発]タブ > [データ] > [図形データ] を使うのがベストだが、
‘ 簡単な方法として「名前」プロパティを書き換える手法がある

For Each shp In pg.Shapes
‘ 人間が付けた特定の名称(Shape.Name)や、
‘ 事前に設定した「図形データ」を条件にする
If shp.Name = “MyButton_Submit” Then
Debug.Print “対象の図形が見つかりました。IDは: ” & shp.ID
Exit For
End If
Next shp

‘ IDで直接取得する場合の書き方
‘ IDが分かっているなら、以下のように書くのが最も高速
Set shp = pg.Shapes.ItemFromID(10) ‘ IDが10の図形を取得

If Not shp Is Nothing Then
MsgBox “図形が見つかりました: ” & shp.Name
Else
MsgBox “指定したIDの図形は存在しません”
End If
End Sub

4. プロのエンジニアが教える「失敗しないための3箇条」

最後に、現場で泣きを見ないための「3箇条」を授けます。

1. 「マクロの記録」を過信しない: マクロの記録で生成されるコードは、`ActivePage.Shapes(“プロセス.1”)`のように名前ベースになりがちです。これは「今この瞬間の操作」を記録しているだけだと理解してください。
2. 独自の命名規則を持つ: 図形を作成したら、すぐに[図形データ](Shape Data)に「ロール(役割)」という項目を作り、「StartNode」や「EndNode」といった値を書き込んでおきましょう。`shp.Cells(“Prop.Role”).Formula`で検索すれば、名前が変わろうと絶対に迷いません。
3. IDは「その場限りの計算」に使う: IDは、ループ処理で「この図形とあの図形をつなぐ」といった、計算処理中の参照には最適です。しかし、外部ファイルにIDを保存して後から呼び出すような使い方は避けてください。

まとめ

Visio VBAにおける図形特定は、「名前は人間用、IDは計算用、メタデータは管理用」と使い分けるのが正解です。

最初は難しく感じるかもしれませんが、この「オブジェクトの背後にある仕組み」を理解したあなたは、もう初心者ではありません。今日からあなたの書くコードは、エラーに強く、メンテナンス性の高い「資産」へと変わるはずです。

Visioという広大な海を、ぜひあなたのコードで自在に操ってください。応援しています!

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