【入門編】Shapeオブジェクトの識別子マスター:ID・Name・NameUの違いと使い分けの鉄則 – Visio VBA解析バイブル

スポンサーリンク

こんにちは!Visio VBAの世界へようこそ。
マクロの記録ボタンを押して、生成されたコードをそのまま動かしてみたものの、「あれ?別の図面で動かすとなぜかエラーになるぞ…?」と頭を抱えた経験はありませんか?

Visioの自動化で最も多く、そして最も初心者がハマる罠。それが「図形の指定方法(識別子)」の混同です。

今回は、Visioの図形を特定するための3つの鍵――`ID`、`Name`(ローカル名)、`NameU`(ユニバーサル名)の正体を徹底的に解剖し、どんな環境でも絶対に壊れない「最強の図形取得ロジック」を手に入れましょう。

ここをクリアすれば、あなたのVisio VBAのスキルは「初心者」から確実に一段上のステージへステップアップしますよ。それでは、一緒に本質を紐解いていきましょう!

1. なぜVisioの図形指定は難しいのか?(3つの識別子の正体)

Visioのページ(Page)の中にある図形(Shape)をコードから操作するとき、私たちは「どれを動かすか」をVisioに教えてあげる必要があります。その目印となるのが以下の3つです。

1. `ID`(整数値):図形がページに生まれた瞬間、Visioが自動的に割り振る「整理番号」。
2. `Name`(文字列):Visioの画面上(シェイプシートやUI)で人間が見る「表示名」。
3. `NameU`(文字列):Visioの裏側で厳格に管理されている「英語のシステム名(ユニバーサル名)」。

これら3つは、それぞれ「性格」が全く異なります。まずはそれぞれの特徴を、優しく整理していきましょう。

① ID(例: `Shapes.Item(1)` や `Shapes.ItemByID(3)`)

  • 特徴: 生まれ順の出席番号。ページ内で常に一意(ユニーク)です。
  • メリット: 処理が一番速い。
  • 致命的な弱点: 図形を削除したり、新しく作ったりすると、番号が狂う・変わる。 マクロの記録で生成されるコードはこれを使うため、図面を少し修正しただけで動かなくなります。

② Name / ローカル名(例: `”プロセス.12″`)

  • 特徴: 私たちが普段目にする名前。日本語環境なら日本語で表示されます。
  • メリット: 人間にとって分かりやすい。
  • 致命的な弱点: Excelなどと同様に、PCの言語環境(日本語版か英語版か)によって名前が変わる。 さらに、同じ名前の図形が複数あるとVisioが混乱し、意図しない図形を掴まされる原因になります。

③ NameU / ユニバーサル名(例: `”Process.12″`)

  • 特徴: Visioが内部で持っている「戸籍名」。世界共通(常に英語・固定)。
  • メリット: 言語環境が変わっても絶対に変わらない。 多言語対応が必要な現場の救世主。
  • 注意点: 初期状態ではVisioが自動で通し番号(`Process.1`など)をつけるため、そのままでは少し味気ないですが、ユーザーが自由に変更することも可能です。

2. 現場で本当に使える「使い分けの鉄則」

チーフアーキテクトである私から、実務で絶対に守るべき鉄則を授けましょう。

  • 一過性の処理(その場で生成して消すなど)`ID` で十分
  • 人間が操作する画面上の特定のマスター図形を探す`NameU` を使うべき
  • 「マクロの記録」が吐き出す `ID` や `Name` だけを信じてはいけない

特に、海外の拠点とやり取りする図面や、将来的に改修を予定している業務ツールでは、`NameU` を制することがVisio VBAを制すると言っても過言ではありません。

3. 実践! 壊れない図形取得コードの書き方

それでは、理論を実際のコードに落とし込んでみましょう。
以下のサンプルコードは、アクティブページの中から特定の図形を安全に探し出し、色を変更するプロシージャです。

Sub SafeShapeFinderSample()
Dim shp As Visio.Shape
Dim targetNameU As String
Dim foundFlag As Boolean

‘ 探したい図形のユニバーサル名(NameU)を指定
‘ ※ここでは例として “Process” という名前が含まれる図形を探します
targetNameU = “Process”
foundFlag = False

‘ ページの全図形を走査する(ループ処理)
For Each shp In ActivePage.Shapes

‘ 【重要】 NameUプロパティを使って言語環境に依存しない比較を行う
‘ InStr関数を使い、システム名の中に目的の文字列が含まれているかチェック
If InStr(1, shp.NameU, targetNameU, vbTextCompare) > 0 Then

‘ 該当する図形を見つけたら、処理を行う
Debug.WriteLine “見つかりました! ID: ” & shp.ID & ” / NameU: ” & shp.NameU

‘ 例として図形の塗りつぶし色を赤(RGB: 255, 0, 0)に変更
shp.Cells(“FillForegnd”).ResultIU = RGB(255, 0, 0)

foundFlag = True
‘ 最初の1つだけで良ければ Exit For で抜けてもOKです
End If

Next shp

If foundFlag Then
MsgBox “図形の処理が完了しました!”, vbInformation
Else
MsgBox “指定されたユニバーサルを持つ図形が見つかりませんでした。”, vbExclamation
End If

End Sub

このコードの優れたポイント

1. `ID`に依存していない:図形が追加・削除されてページ内のIDがシャッフルされても、このコードはビクともしません。
2. `NameU`を使っているため安全:たとえExcelやVisioの表示言語が英語環境に切り替わっても、`NameU`(内部システム名)は変わらないため、ロジックが破綻しません。
3. `For Each`による安全なオブジェクト走査:存在しないインデックスを直接指定して「インデックスが有効範囲にありません」というエラー(実行エラー 9)を踏むリスクを完全に回避しています。

まとめ:ここをクリアすればVisio VBAは怖くない!

今回は、Visio VBAの心臓部とも言える「図形の識別子(ID・Name・NameU)」について解説しました。

  • ID は「一時的な出席番号(構造が変わると変わる)」
  • Name は「見た目の名前(言語環境で変わる)」
  • NameU は「揺るぎない戸籍名(どんな環境でも不変)」

この違いを腹に落とし込めたあなたなら、もう「マクロの記録が吐き出したコードを恐る恐る動かす」必要はありません。自分自身でメンテナンス性が高く、プロフェッショナルな堅牢なコードを書くことができます。

日々の業務自動化の苦労が、少しでもラクに、そして楽しくなりますように。
それでは、次回の高度なVisio自動化の世界でお会いしましょう!バッチリ使いこなしてくださいね!

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