【入門編】Application.Versionと言語識別:複数バージョンのVisio環境で破綻しない互換性抜群のコード設計 – Visio VBA解析バイブル

スポンサーリンク

Visio VBAの「見えない壁」を突破せよ:バージョン混在環境を制するプロの設計術

こんにちは。自動化の深淵へようこそ。

現場でVisio VBAを扱っていると、必ずと言っていいほど直面する「見えない壁」があります。それは、「自分の環境では完璧に動くのに、同僚のPC(別のバージョン)で実行するとエラーで落ちる」という悪夢です。

Visioは歴史が長いプロダクトゆえ、バージョンアップのたびに微妙なAPIの挙動や言語設定の揺らぎが発生します。今回は、そんな環境依存の罠を回避し、どんな現場でも「動いて当たり前」の堅牢なコードを構築するための極意を伝授します。

1. なぜ「バージョン問題」が起きるのか?

Visioのオブジェクトモデル(Application > Document > Page > Shape)は非常に強力ですが、バージョンによって「扱えるメソッド」や「プロパティの解釈」が微妙に異なります。

特に、日本語版と英語版の言語IDの差異や、特定のバージョンでしか存在しないプロパティを不用意に叩くと、VBAは即座に「実行時エラー」を吐いて停止します。

これを防ぐには、コードの冒頭で「今、誰が、どんな環境で自分を動かしているのか」を自己診断させるのが、プロの流儀です。

2. 環境を掌握する「自己診断」コード

まずは、現在の環境を特定し、安全な分岐を作るためのテンプレートを共有します。これをモジュールの先頭に置くだけで、コードの安定性は劇的に向上します。

Option Explicit

‘ Visioの環境情報を取得し、安全な処理分岐を作るためのクラス的プロシージャ
Public Sub InitializeEnvironment()
Dim appVersion As Double
Dim langID As Long

‘ Application.Versionは文字列で帰ってくるため、数値に変換して判定する
‘ 例: “16.0” = Visio 2016/2019/2021/365
appVersion = CDbl(Application.Version)

‘ 言語IDを取得 (1041は日本語)
langID = Application.Language

Debug.Print “現在のVisioバージョン: ” & appVersion
Debug.Print “現在の言語コード: ” & langID

‘ バージョンによる処理の切り分け例
If appVersion >= 16.0 Then
‘ 2016以降で有効な高度なAPIを呼び出す処理
Else
‘ 旧バージョン向けの互換処理
End If
End Sub

3. 「言語の壁」を越えるためのテクニック

Visio VBAで最も陥りやすい罠が、「図形名やレイヤー名の指定」です。

日本語環境のVisioでは、標準のレイヤー名やステンシル名が日本語(例:「基本フローチャート」)になっていますが、英語版では英語(例:「Basic Flowchart」)です。これらを直書きすると、海外拠点や英語OSのPCで即座にクラッシュします。

対策:名前ではなく「ID」や「ローカル名」を避ける

可能な限り、名前(Nameプロパティ)ではなく、「NameUプロパティ(Universal Name)」を使用してください。NameUは言語に依存しない「プログラミング用名称」であり、どの言語環境でも一意に特定可能です。

‘ 悪い例:言語に依存してエラーになる
‘ Set shp = ActivePage.Shapes(“プロセス”)

‘ 良い例:NameU(Universal Name)を使用する
‘ これなら英語環境でも日本語環境でも同一の図形を指せる
Dim shp As Visio.Shape
Set shp = ActivePage.Shapes.ItemFromID(1) ‘ IDで直接指定するのも確実な手段

4. 陥りやすいエラー:オブジェクトの「解放」を忘れるな

初心者の方が最も見落としがちなのが、オブジェクトのライフサイクル管理です。特にVisioの`Application`や`Document`を多用する場合、明示的に`Nothing`を代入してメモリを解放しないと、Visioプロセスがバックグラウンドに残り続け、次に開く際に「ファイルがロックされています」というエラーを引き起こします。

Public Sub SafeProcess()
Dim doc As Visio.Document
Set doc = ActiveDocument

‘ — ここで処理を行う —

‘ 処理が終わったら必ずメモリから解放する
Set doc = Nothing
End Sub

最後に:自動化エンジニアとしての心得

VBAを書くということは、単に手順を自動化するだけではありません。「未来の自分が、あるいは他人が、このコードを修正することになっても、決して壊れない仕組みを作る」ことこそが、真のエンジニアリングです。

まずは、コードの先頭に環境チェック機能を組み込むことから始めてみてください。それだけで、あなたは「マクロが書ける人」から「システムを設計できる人」へと一歩進化できます。

分からないことがあれば、いつでも聞いてくださいね。あなたの自動化の旅を、全力でサポートします。

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