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

スポンサーリンク

Visio VBAの「環境依存」という罠を破壊せよ:真に堅牢なクロスバージョン・クロスランゲージ設計論

現場でVisio自動化ツールを開発していると、必ず突き当たる壁がある。それは「自分のPCでは動くのに、隣の席のPCや、海外拠点のPCではエラーを吐く」という悪夢だ。

`Application.Version` を安易に判定に使い、`Cells(“Width”).Formula` を日本語環境の決め打ちで書いていないか? もしそうなら、あなたのコードは「時限爆弾」を抱えているに等しい。

世界最高峰の自動化を目指す諸君へ。今日は、どんな環境でも沈まない「沈まない船」としてのVBA設計術を伝授する。

1. なぜ `Application.Version` だけでは不十分なのか

多くの初学者は `If Application.Version >= 16 Then` のような分岐で環境を制御しようとする。だが、これは氷山の一角に過ぎない。

Visioの真の脅威は「言語パックによる関数名の揺らぎ」「名前空間の差異」だ。
例えば、シェイプシートの `Guard()` 関数。日本語版Visioで記録したマクロを英語版環境で動かすと、関数名や引数の区切り文字(カンマかセミコロンか)が異なり、容赦なく `Runtime Error` を叩き出す。

堅牢な設計の鉄則

  • 「名前」で指定しない: `Cells(“Width”)` は避け、`CellsU` (Universal Name) を使え。
  • ロケールを無視する: `Formula` ではなく `FormulaU` を常に使う。これが国際化対応の絶対条件だ。
  • 環境判定の抽象化: バージョンごとにロジックを分岐させるのではなく、実行時に「環境適合オブジェクト」を生成する戦略をとる。

2. 実践:環境を抽象化する「Visio環境コントローラー」

以下は、バージョンや言語環境を意識せずにシェイプを操作するための、プロダクションレベルの基本コードだ。

‘ ———————————————————
‘ クラスモジュール: VisioEnvironment
‘ 目的: バージョンや言語環境の違いを吸収し、正規化した操作を提供する
‘ ———————————————————
Option Explicit

Private m_Version As Double

Private Sub Class_Initialize()
‘ バージョンを数値化(16.0 = Visio 2016/2019/365)
m_Version = CDbl(Application.Version)
End Sub

‘ 汎用的なセル取得メソッド(環境差分を吸収)
Public Function GetSafeCell(shp As Visio.Shape, cellNameU As String) As Visio.Cell
On Error Resume Next
‘ CellsU を使用することで、言語依存を回避
Set GetSafeCell = shp.CellsU(cellNameU)

If Err.Number <> 0 Then
Debug.Print “Error: Cell ” & cellNameU & ” not found.”
End If
End Function

‘ ロケールに依存しない数式設定
Public Sub SetSafeFormula(shp As Visio.Shape, cellNameU As String, formulaU As String)
‘ FormulaU は常に英語表記の関数を期待する
shp.CellsU(cellNameU).FormulaU = formulaU
End Sub

3. 現場で「死なない」ための3つの作法

① `CellsU` と `FormulaU` への完全移行

日本のVisio開発者が陥る最大の罠は、マクロ記録のコードをそのまま使うことだ。マクロ記録はローカル言語(日本語)で記録されるため、そのまま他環境へ持っていくと動かない。必ず `U` が付くプロパティを選べ。これが「世界標準」だ。

② シェイプIDと名前の混同を避ける

`ActivePage.Shapes(“Process”)` のように名前に頼るのは危険だ。日本語環境では「プロセス」になる可能性がある。

  • 解決策: マスターシェイプの `UniqueID` を利用するか、`User.ID` 等のカスタムプロパティを埋め込んで検索する仕組みを構築せよ。

③ データベース/ファイル連携時のパス処理

異なるOS環境(特にWindowsのユーザープロファイル)を跨ぐ場合、`Environ(“USERPROFILE”)` を使うのは素人だ。
`Application.Path` や `Document.Path` を基準に相対パスを算出するロジックを組み込め。これがないツールは、配布した瞬間に保守地獄が始まる。

4. 最後に:エンジニアとしての矜持

VBAはレガシーと言われることもある。だが、Visioのオブジェクトモデルを完全に掌握し、環境の揺らぎを計算し尽くしたツールは、最新のWebアプリにも負けない「究極の業務効率化エンジン」になる。

  • バージョン判定はクラスに隠蔽せよ。
  • 言語依存の文字列はコード内に直書きせず、設定ファイルに逃がせ。
  • エラーハンドリングを怠るな。

君たちが書く一行のコードが、誰かの作業時間を1時間削減する。その重みを背負って、美しく、堅牢な自動化の世界を突き進んでほしい。

何か不明点があれば聞くといい。Visioの深淵については、いつでも語れる準備ができている。

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