【実務・中級編】【初心者】Shape.NameとNameUの使い分け:多言語環境でも壊れない図形識別コードの書き方 – Visio VBA解析バイブル

スポンサーリンク

【Visio VBA】なぜあなたのツールは「言語設定」で壊れるのか? NameとNameUの絶対的な境界線

業務自動化の現場で、VisioのVBAを書いているエンジニアの多くが陥る「初歩的かつ致命的な罠」がある。それが `Shape.Name` への依存だ。

「とりあえず名前で図形を特定すれば動く」。そう考えて `If shp.Name = “Process” Then …` と書いた瞬間に、そのコードは時限爆弾と化す。なぜなら、Visioはインストールされている言語環境によって、デフォルトの図形名が動的に変化するからだ。

今日は、世界中のどの環境でも止まらない、堅牢なVisio自動化システムの「心臓部」である識別戦略について語る。

—

1. Name と NameU:神話と現実

Visioのオブジェクトには、必ず「名前」に関連するプロパティが2つ存在する。

  • `Name`: ユーザーインターフェース(UI)上の表示名。言語設定に依存する(例:日本語版では「プロセス」、英語版では「Process」)。
  • `NameU`: Universal Name。言語設定に依存しない、開発者にとっての「真の名前」。

なぜ `Name` を使ってはいけないのか

あなたが日本語環境で開発したツールを、海外拠点の担当者が英語版Visioで開いたとする。その瞬間、コード内の `shp.Name = “プロセス”` は一致せず、ツールは沈黙する。これはバグではなく、設計ミスだ。

原則:プログラムの内部ロジックにおいて、`Name` を参照してはならない。

—

2. 破壊的なID変更に備える:メタデータによる識別

「じゃあ `NameU` を使えば完璧か?」と言われれば、それも半分正解で半分は不十分だ。
ユーザーが図形をコピー&ペーストしたり、グループ化を解除したりすれば、`NameU` や `ID` は簡単に変動する。

本気で堅牢なシステムを組むなら、ShapeSheetの「User定義セル」に独自の識別ID( GUIDなど)を埋め込むのが、プロのエンジニアが辿り着く解だ。

—

3. 実践:保守性の高い図形取得コード

以下のコードは、図形名(NameU)だけでなく、カスタムプロパティ(User定義セル)を併用して図形を特定する、プロダクションレベルのテンプレートである。

‘ ———————————————————
‘ 目的:言語設定に依存せず、かつID変更にも強い図形取得関数
‘ ———————————————————
Public Function GetShapeByCustomID(page As Visio.Page, targetID As String) As Visio.Shape
Dim shp As Visio.Shape

‘ 全ての図形をループして探索(検索効率を考慮し、必要に応じて親グループに限定)
For Each shp In page.Shapes
‘ User定義セルに埋め込んだカスタムIDをチェック
‘ ※事前にShapeSheetの User.MyCustomID に値を書き込んでいる前提
On Error Resume Next
If shp.CellExists(“User.MyCustomID”, False) Then
If shp.Cells(“User.MyCustomID”).ResultStr(“”) = targetID Then
Set GetShapeByCustomID = shp
Exit Function
End If
End If
On Error GoTo 0
Next shp

‘ 見つからなかった場合は Nothing を返す
Set GetShapeByCustomID = Nothing
End Function

このコードの「設計思想」

1. `CellExists` による安全策: `User.MyCustomID` が存在しない図形に無理やりアクセスしてエラー(ランタイムエラー)が出るのを防ぐ。
2. 疎結合: 特定の図形名に頼らない。運用側でShapeSheetを書き換えるだけで、コードを修正せずに図形をリネームできる。
3. 拡張性: 将来的にデータベース(AccessやSQL Server)と連携する際、この `targetID` をキーにすることで、Visio図面と外部データを1対1で整合させることが可能になる。

—

4. プロフェッショナルへの提言:設計のチェックリスト

業務自動化ツールを納品する際、以下の3点を意識しているか自問してほしい。

  • 多言語対応: `NameU` を使用しているか?(ユーザーへの表示は `Name` でも良いが、ロジックは必ず `NameU` を通すこと)
  • IDの永続性: 図形をコピペされても識別可能か?(ShapeSheetへのメタデータ書き込みを検討すること)
  • エラーハンドリング: `Shapes` コレクションへのアクセス時、該当オブジェクトが存在しないケースを「想定内」として設計しているか?

最後に

Visio VBAの世界において、最も高価なコストは「動かなくなったコードの改修」だ。
最初は `Name` を使ったほうが楽かもしれない。しかし、その甘えが数ヶ月後のあなたに牙を剥く。

今日から `NameU` を正しく使い、メタデータで図形を管理せよ。そうすれば、あなたのツールは言語や環境の壁を超えて、どこまでも信頼できる自動化のエンジンとなるだろう。

コードは嘘をつかない。設計の甘さが、技術的負債として積み上がるだけだ。

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