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

スポンサーリンク

Visio VBAの「名前」に潜む罠:Page.NameとPage.NameUを使い分け、グローバルな自動化を掴め

こんにちは。業務自動化の現場でVisioと格闘する皆さんに、今日は一つ、現場で必ず直面する「落とし穴」と、それを回避する「プロの作法」をお伝えします。

皆さんがせっかく書いた自動化マクロ、「日本語環境では動くのに、英語環境のPCに持っていったらエラーで止まった」なんて経験はありませんか?

その原因の多くは、`Page.Name` を安易に使っていることにあります。今日は、Visioのオブジェクトモデルを深く理解し、どんな環境でも壊れない強靭なマクロを作るための「名前」の哲学を学びましょう。

1. なぜ「名前」は二種類あるのか?

Visioのページ(Page)には、必ず二つの名前が存在します。

  • `Page.Name`:表示名。ユーザーがタブ上で直接変更できる名前です。「見え方」を重視するため、言語設定やユーザーの気分でコロコロ変わります。
  • `Page.NameU`:ユニバーサル名。Visioの内部で管理される「背番号」のようなもの。言語に依存せず、一度決まったらシステムが変更しない限り変わりません。

悲劇のシナリオ

例えば、あなたが「表紙」という名前のページをプログラムで探そうとします。

‘ 危険なコード:日本語環境以外では死ぬ
If ActivePage.Name = “表紙” Then
‘ 何かの処理
End If

このコードは、日本語版Visioでは美しく動きます。しかし、英語版Visioではそのページ名は「Cover」かもしれません。この瞬間、あなたのマクロは沈黙し、ユーザーは「動かない!」と嘆くことになります。

2. 現場で生き残る「NameU」の作法

プロの現場では、「人間が見る名前(Name)には触れず、機械が管理する名前(NameU)で特定する」のが鉄則です。

安全にページを取得する実装例

特定のページを操作したい場合、`Name`を比較するのではなく、`NameU`をループで回して照合するのが最も堅牢です。

Public Sub FindPageSafely()
Dim pg As Visio.Page
Dim targetPage As Visio.Page

‘ ページ名(NameU)で安全にターゲットを特定する
For Each pg In ActiveDocument.Pages
‘ NameUは言語に関わらず不変の識別子
If pg.NameU = “Page-1” Then
Set targetPage = pg
Exit For
End If
Next pg

If Not targetPage Is Nothing Then
Debug.Print “ページを発見しました: ” & targetPage.Name
Else
MsgBox “対象ページが見つかりません。”
End If
End Sub

このコードのポイント

1. 環境依存を排除:`pg.NameU`を使うことで、日本語版・英語版・フランス語版…どこのPCでも同じ挙動を保証します。
2. イテレーションの活用:`ActiveDocument.Pages`を全探索することで、ユーザーが勝手にページ名を変更しても、内部的な識別子さえ合致していれば正確に捕まえられます。

3. なぜ「マクロの記録」だけでは足りないのか?

「マクロの記録」を使うと、よく以下のようなコードが出力されます。

‘ マクロの記録が生成しがちなコード
Application.ActiveWindow.Page = Application.ActiveDocument.Pages.ItemU(“Page-1”)

これでも動きますが、「対象のページが必ず存在する」という前提に立っています。業務自動化においては、ページが存在しない場合のエラーハンドリングや、動的に作成されるページへの対応が重要です。

プロのエンジニアは、マクロの記録を「ヒント」として使い、実際のコードは「探索・検証・操作」というプロセスを厳密に書きます。

4. 今日から始める、壊れないマクロ構築のヒント

最後に、皆さんが明日から使える「極限の知見」を3つだけ共有します。

1. 定数化する:コード中に `”Page-1″` と直書きせず、`Const TARGET_PAGE_NAMEU As String = “Page-1″` とモジュールの先頭で定義しましょう。後から変更が必要になった際、修正は一箇所で済みます。
2. ユーザーにNameを変えさせるな:もしシステム的に重要なページがあるなら、`Page.Name`はユーザーに自由にいじらせておき、`Page.NameU`だけは決して変更させないよう、運用ルールや保護設定で守るのが上策です。
3. デバッグ時は常にNameUを表示する:開発中は、イミディエイトウィンドウで `?ActivePage.NameU` を実行する癖をつけてください。「今、システムはどのページを指しているのか?」を常に意識することで、バグは劇的に減ります。

まとめ:Visioの「魂」を操作する

Visio VBAは、単なる自動化ツールではありません。オブジェクトのライフサイクルを理解し、言語の壁を超えて制御するエンジニアリングの粋です。

`Name`と`NameU`。この二つを意識するだけで、あなたの書くコードは「動く」から「信頼できる」へと進化します。

ここをクリアしたあなたは、もう初心者ではありません。さあ、次はどんな複雑な図面を自動化しましょうか? 応援しています!

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