Visio VBAの深淵へようこそ:Shapeオブジェクトを「確実に」射抜くためのIDとNameの極意
Visio VBAの世界へようこそ。マクロの記録ボタンを押して生成されたコードを眺め、「なぜか動いたり動かなかったりする……」と頭を抱えたことはありませんか?
その原因の9割は、「Visioが図形をどう識別しているか」という本質を誤解していることにあります。今日は、Visio自動化の第一歩にして最大の壁、「Shapeオブジェクトの識別」について、伝説的エンジニアの視点から解き明かしていきましょう。
—
1. なぜ「狙った図形」が掴めないのか?
VBAで特定の図形を操作したいとき、私たちはつい `ActivePage.Shapes(“プロセス”)` のように名前で指定したくなります。しかし、これが地獄の入り口です。
Visioには、図形を識別するための「2つの顔」があります。
① ID(Shape.ID)
- 正体: ページ内で一意に割り振られる「背番号」。
- 特徴: 絶対に重複しない。ページ内での処理速度が最も速い。
- 弱点: 図形をコピー&ペーストしたり削除したりすると、あっさり変わる。
② Name(Shape.Name)
- 正体: UI上のラベルや、ユーザーが自由に付けた「名前」。
- 特徴: 人間が見て分かりやすい。
- 弱点: 重複する可能性がある。 また、ユーザーが図形をコピペすると「プロセス.1」「プロセス.2」のように自動でサフィックスが付与され、指定した名前が変わってしまう。
「名前で指定したはずなのに、エラーになる」
この原因は、ほとんどの場合「コピペで名前が変わった」か「同名の図形が複数存在してVisioが迷子になった」かのどちらかです。
—
2. 実践:IDとNameを使い分ける「鉄壁のコード」
現場で生き残るプロは、状況に応じてこの2つを使い分けます。以下のコードを読んでみてください。
ケースA:IDで高速にアクセスする(確実な処理)
動的に生成された図形や、特定のIDを保持している場合は、ID指定が最強です。
Sub GetShapeByID()
Dim shp As Visio.Shape
‘ ID番号は Integer型。ページ内の図形を瞬時に射抜く
Set shp = ActivePage.Shapes.ItemFromID(1)
‘ 存在確認は必須。IDが変わっている可能性を常に疑う
If Not shp Is Nothing Then
shp.Cells(“FillForegnd”).Formula = “RGB(255,0,0)”
End If
End Sub
ケースB:Nameでループして探す(柔軟な処理)
「『承認』という名前の図形を全部見つけて色を変えたい」といったケースでは、IDは使えません。このときはループ処理で「名前の頭文字」をチェックするのが定石です。
Sub FindShapesByName()
Dim shp As Visio.Shape
Dim targetName As String: targetName = “承認”
‘ ページ内の全図形をスキャンする
For Each shp In ActivePage.Shapes
‘ 名前の一部に「承認」が含まれているか判定
‘ .NameU を使うと、言語設定に依存せず英語名で判定できるため、より堅牢!
If InStr(shp.NameU, targetName) > 0 Then
shp.Cells(“LineWeight”).Formula = “3 pt”
End If
Next shp
End Sub
—
3. プロの知恵:NameUプロパティを愛せ
ここでもう一つ、現場で差がつくテクニックを授けましょう。
Visioには `Name` と `NameU` という2つの名前プロパティがあります。
- Name: 実行環境の言語設定(日本語版Visioなら日本語)に依存する。
- NameU: 常に英語のユニバーサル名を返す。
もし、あなたが作ったツールを海外拠点でも使わせたいなら、必ず `NameU` を使ってください。`Name` を使ってしまうと、日本語版の「プロセス」という名前を、英語版Visioでは認識できずにバグります。「ユニバーサル名で書く」のは、グローバルな開発現場での最低限のマナーです。
—
まとめ:今日から意識すべきこと
1. ID指定は「速い」が「脆い」: ページ構成が変わらない定型処理で使え。
2. Name指定は「直感的」だが「重複リスクがある」: 必ずループ処理で探索せよ。
3. NameUを使え: 言語環境に左右されない、プロフェッショナルなコードを書け。
Visioの図形は、単なる「四角」や「丸」ではありません。それは、あなたが定義するデータ構造の断片です。IDとNameという「背番号」と「名前」を正しく扱うことで、あなたのマクロは、エラーを吐かない「堅牢なエンジン」へと進化します。
さあ、次はどの図形を自在に操りましょうか? 分からないことがあれば、いつでもまた聞きに来てくださいね。あなたの自動化の旅を、全力でサポートします。
