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` に書き換えるところから始めてみてください。その小さな一歩が、あなたの自動化ライフを劇的に変えるはずです。
何か分からないことがあれば、いつでもまた聞きに来てくださいね。エンジニア同士、共に成長していきましょう!
