【実務・中級編】Page.NameとPage.NameUの使い分け:多言語環境やVisio標準テンプレートで破綻しない国際化対応マクロの構築 – Visio VBA解析バイブル

スポンサーリンク

Visio VBAの「名前」に潜む罠:NameUで実現する国際化対応の極意

Visioの自動化において、初心者が最初に犯す致命的なミスがある。それは、「ページ名(Name)をキーにして制御を行ってしまうこと」だ。

「え? ページの名前で指定して何が悪いのか?」と思ったなら、あなたのコードは多言語環境や、標準テンプレートを介した配布において、近い将来必ずクラッシュする。

Visioのオブジェクトモデルを掌握する上で、`Name`と`NameU`の挙動の違いを理解することは、プロとアマを分かつ絶対的な境界線だ。今回は、現場で「動かない」「壊れる」を撲滅し、グローバルで通用する堅牢なVisio自動化の設計指針を授ける。

1. なぜ「Name」を使ってはいけないのか

Visioの `Page` オブジェクトには、二つの「名前」が存在する。

  • `Name` プロパティ: 表示上の名前。ユーザーが変更可能であり、システムの言語設定に依存する(例:日本語版なら「ページ-1」、英語版なら「Page-1」)。
  • `NameU` プロパティ: ユニバーサル名。Visioが内部的に管理する不変のIDに近い名前。言語設定に関わらず一定。

致命的なシナリオ

あなたが作成したマクロが「ページ-1」を探しに行くコードだったとしよう。
1. 日本語版のVisioで作成したツールを、海外拠点のPC(英語版OS/Visio)で実行する。
2. 英語版Visioは自動的に「ページ-1」を「Page-1」へと変換、あるいはユーザーが手動でリネームする。
3. `If pg.Name = “ページ-1” Then …` と書かれたあなたのコードは、その瞬間に死ぬ。

業務自動化ツールを「配布可能なプロダクションレベル」にするためには、「表示名(Name)はユーザーの持ち物、内部名(NameU)はエンジニアの持ち物」という原則を徹底せよ。

2. 堅牢なページ特定アルゴリズム

実務における最適解は、「NameUを走査し、目的のオブジェクトを特定する関数」を実装することだ。`Name`に依存しない検索ロジックを共通化せよ。

以下に、現場でそのまま使える、保守性の高い汎用関数を提示する。

‘ @brief NameUをキーにしてページを安全に取得する関数
‘ @param doc 対象のDocumentオブジェクト
‘ @param targetNameU 探したいページ等のユニバーサル名
‘ @return 見つかった場合はPageオブジェクト、見つからない場合はNothing
Public Function GetPageByNameU(doc As Visio.Document, targetNameU As String) As Visio.Page
Dim pg As Visio.Page

‘ Document内の全ページをループしてNameUを照合
For Each pg In doc.Pages
‘ 大文字小文字を区別しない比較を行うのが定石
If StrComp(pg.NameU, targetNameU, vbTextCompare) = 0 Then
Set GetPageByNameU = pg
Exit Function
End If
Next pg

‘ 見つからなかった場合は明示的にNothingを返す
Set GetPageByNameU = Nothing
End Function

3. 実践:保守性を極めた設計パターン

単にコードを書くのではなく、外部設定(ConfigファイルやDB)からページ名を読み込むような設計にする場合、この `NameU` の知識はさらに威力を発揮する。

悪い設計の例

‘ マクロ内に直接「ページ-1」と書く(ハードコード)
‘ これでは仕様変更や言語切り替えで即座に破綻する
Set pg = ActiveDocument.Pages(“ページ-1”)

プロの設計(分離と抽象化)

Public Sub ProcessBusinessLogic()
‘ 定数や設定ファイルからNameUを読み込む
Const TARGET_PAGE_U = “ProcessFlow_01”

Dim pg As Visio.Page
Set pg = GetPageByNameU(ActiveDocument, TARGET_PAGE_U)

If pg Is Nothing Then
‘ エラー処理を握りつぶさない。ログを出力し運用に回す
Err.Raise vbObjectError + 1000, , “Critical: ページ ” & TARGET_PAGE_U & ” が見つかりません。”
End If

‘ ここから先は安心して処理を継続できる
Debug.Print “対象ページを特定しました: ” & pg.Name
End Sub

4. 最後に:なぜこの意識が必要なのか

Visioの自動化ツールは、一度作れば数年単位で利用されることが多い。しかし、その間にOSのアップデート、Officeの言語パック変更、あるいはユーザーによる「ちょっとしたリネーム」が必ず発生する。

「動くコード」を書くのは簡単だが、「壊れないコード」を書くには、Visioという巨大なエンジンが内部で何を考え、何に依存しているかを理解しなければならない。

  • `Name` はユーザーのインターフェース。
  • `NameU` はシステムのインターフェース。

この境界線を一線引くこと。それが、君がプロフェッショナルな業務自動化エンジニアとして評価されるための、最初の一歩だ。

さあ、今すぐ自分のコードの `Page.Name` を検索して、`NameU` に置き換えるべき箇所がないか確認してほしい。それが君のツールを「おもちゃ」から「業務インフラ」に変えるための、最も賢明な投資になるはずだ。

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