【入門編】Application.Versionと言語設定の動的取得:複数バージョンのVisio環境で動作する互換性の高いVBAマクロの構築 – Visio VBA解析バイブル

スポンサーリンク

Visio VBAの極意:環境の壁を越える「動的プログラミング」の設計思想

Visio VBAの世界へようこそ。マクロの記録ボタンを押して生成されたコードを眺めて、「なぜか別のPCだと動かない」「日本語版と英語版でエラーになる」といった壁にぶつかっていませんか?

それは、あなたのコードが悪いのではなく、Visioという巨大なオブジェクトの「性格」を知るステップに差し掛かった証拠です。今日は、どの環境でも涼しい顔して動作する、プロ仕様のコードを書くための秘訣を伝授します。

1. なぜ「環境の違い」でエラーが起きるのか?

VisioのVBAは、非常に強力ですが「環境依存」に弱い側面があります。特に以下の3つがトラブルの火種です。

1. バージョン(Version): オブジェクトモデルの追加や仕様変更。
2. 言語(Locale): 「Sheet.1」といったセル名や、ステンシルの名前が「日本語」と「英語」で異なる。
3. パス(Path): ユーザーごとのインストールフォルダの違い。

これらを力技で解決しようとすると、`On Error Resume Next` の乱用という「負の遺産」を生み出します。そうではなく、Visio自身に「今、自分はどんな環境にいるのか」を問いかけるのが、真のエンジニアの流儀です。

2. 環境を掌握する:Application.VersionとロケールID

まずは、現在実行しているVisioの「格」を知ることから始めましょう。

バージョンの判定

`Application.Version` は、Visioのバージョンを文字列で返します。これを使って、特定のバージョンでしか使えない機能を分岐させます。

言語設定(ロケールID)の判定

ここが重要です。Visioには「言語設定(LocaleID)」が存在します。日本語版なら `1041`、英語版なら `1033` です。これを知っていれば、文字列比較に頼らずに処理を切り替えられます。

‘ 現在のVisio環境の情報を取得し、ログに出力する関数
Public Sub CheckEnvironment()
Dim app As Visio.Application
Set app = Visio.Application

‘ 1. バージョンの取得
Debug.Print “Visio Version: ” & app.Version

‘ 2. ロケールIDの取得(1041なら日本語、1033なら英語)
‘ これにより、言語依存のセル名問題を解決する準備が整う
Debug.Print “Language ID: ” & app.LanguageSettings.LanguageID(msoLanguageIDUI)
End Sub

3. 実践:環境を吸収する「ユニバーサル・セルアクセス」

多くの人が陥る罠が、`Shape.Cells(“Width”)` と直接書いてしまうことです。実は、Visio内部のセル名は言語によって翻訳されることがあり、日本語環境でしか動かないコードになりがちです。

ここで登場するのが 「ユニバーサル名(Universal Name)」 です。`CellsU` プロパティを使うと、言語設定を無視して「システム内部の標準名」でセルにアクセスできます。

悪い例

‘ 日本語環境だと動くが、英語版だと「Width」が見つからずエラーになる可能性がある
shp.Cells(“幅”).Formula = “10mm”

良い例(プロの書き方)

‘ CellsUを使うことで、環境に関わらず常に同じセルを特定できる
‘ 「Width」は内部名称なので、世界共通で動作する
shp.CellsU(“Width”).Formula = “10mm”

4. 複数環境対応のテンプレートコード

これらを組み合わせた、現場でそのまま使える「環境適応型」の初期化パターンです。

Public Sub SafeInitialize()
Dim ver As Double
ver = Val(Application.Version)

‘ 例:Visio 2013以上でのみ実行したい処理
If ver >= 15.0 Then
‘ 最新の機能を安全に呼び出す
Debug.Print “Modern Visio detected.”
End If

‘ 言語に依存しないセル操作の例
Dim shp As Visio.Shape
Set shp = ActivePage.Shapes(1)

‘ CellsU を使えば、どの言語版のVisioでも「Width」を正しく認識する
shp.CellsU(“Width”).Formula = “50mm”
shp.CellsU(“Height”).Formula = “30mm”

MsgBox “環境適応完了!どの言語でも動作するコードです。”
End Sub

読者へのエール:ここをクリアすれば「脱・初心者」

ここまで理解できたあなたは、もう「マクロの記録」に頼るだけのユーザーではありません。

  • `Cells` ではなく `CellsU` を使うこと
  • `Application.Version` で未来を見据えること
  • 言語IDを意識して環境を抽象化すること

この3つを意識するだけで、あなたの書くVBAは驚くほど堅牢(ロバスト)になります。Visioのオブジェクトモデルは巨大ですが、その本質は「名前」と「位置」と「関係性」の管理です。

焦る必要はありません。まずは今書いているコードの `Cells` を `CellsU` に書き換えるところから始めてみてください。その小さな一歩が、あなたの自動化ライフを劇的に変えるはずです。

何か分からないことがあれば、いつでもまた聞きに来てくださいね。エンジニア同士、共に成長していきましょう!

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