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という広大な海を、ぜひあなたのコードで自在に操ってください。応援しています!
