【実務・中級編】【初心者向け】AcadApplication.Versionプロパティで実行環境を特定し、AutoCADのバージョン毎の挙動差異を吸収する – AutoCAD VBA解析バイブル

スポンサーリンク

【AutoCAD VBAを掌握する極限の知見】第1回:Versionプロパティで実行環境をハックせよ

開発現場で最も恐れられる瞬間。それは、「自分の開発環境では完璧に動いたマクロが、客先の別バージョン環境(あるいは他部署の古びた端末)で突如として「実行時エラー」を吐き、CADごと沈黙する瞬間」だ。

君たちは、AutoCADのバージョンアップサイクルの速さを甘く見ていないか?
毎年リリースされる新機能、こっそりと仕様変更されるCOMインターフェース、そして非推奨(Obsolete)になり突然削除されるメソッドたち。これらに怯えることなく、「どのバージョンで動かそうとも、絶対に沈まない堅牢なマクロ」を作り上げるための知見を、今日ここで授けよう。

今回は、環境適応型コードの要である `AcadApplication.Version` プロパティを取り上げる。

1. なぜ「バージョン依存のバグ」は起きるのか?

AutoCAD VBA(ActiveX Automation)の裏側では、OSのCOM(Component Object Model)が稼働している。VBAからメソッドを叩くとき、それは常に「現在メモリ上にロードされているAutoCADのプロセス」と対話している状態だ。

ここで問題になるのが、バージョンごとのオブジェクトモデルの差分である。
例えば、ある新しいハッチング機能や幾何拘束のメソッドが AutoCAD 2022 以降にしか実装されていないとする。それを AutoCAD 2020 の環境で実行すれば、当然ながらCOMは「そんなメソッド知らん」とエラーを返す。

ここで初心者がやりがちな最悪のアンチパターンを見てみよう。

❌ 失敗例:エラーフック無しの力技(絶対にやるな)

Sub BadCode_Example()
‘ 2022以降専用のメソッドを無条件で叩く
Dim acadApp As AcadApplication
Set acadApp = ThisDrawing.Application

‘ ここで2020だと即座に実行時エラー「438: オブジェクトは、このプロパティまたはメソッドをサポートしていません。」
acadApp.ActiveDocument.NewShinyMethodFor2022
End Sub

エラー処理(`On Error Resume Next`)で力技に逃げる者もいるが、それは設計の敗北だ。エラーハンドリングは例外的な事象のために使うものであり、バージョン差異という「既知の分岐条件」を隠蔽するために乱用してはならない

プロのエンジニアは、実行環境の内部バージョンを先回りして取得し、スマートに振る舞いを変える。

2. AcadApplication.Version が返す「真実の文字列」

`AcadApplication.Version` プロパティは、単なる西暦(”2024″など)を返さない。こいつが返すのは、AutoCADのコアエンジンである ObjectARXの内部バージョン番号 だ。

実務で必ず直面する主要なバージョン対応表を叩き込んでおけ。

| AutoCADのマーケティング名 | Versionプロパティの戻り値 | 内部コード名(参考) |
| :— | :— | :— |
| AutoCAD 2020 | `23.1` | R23.1 |
| AutoCAD 2021 | `24.0` | R24.0 |
| AutoCAD 2022 | `24.1` | R24.1 |
| AutoCAD 2023 | `24.2` | R24.2 |
| AutoCAD 2024 | `24.3` | R24.3 |
| AutoCAD 2025 | `25.0` | R25.0 |

この数値をパース(解析)し、浮動小数点数(Double)として比較・判定するのが、堅牢な環境適応型コードの基本戦術となる。

3. 【プロダクションコード】環境適応型ファクトリーパターン

それでは、実務の現場でそのままコピー&ペーストして使える、極めて保守性の高いコードを提示しよう。

このコードは、現在のAutoCADのバージョンを安全に判定し、バージョンごとに異なる処理(または代替処理)を安全にディスパッチ(振り分け)する構造を持っている。

Option Explicit

‘ =================================================================================
‘ モジュール名: modVersionController
‘ 概要: AutoCADのバージョン差異を吸収し、安全に処理を分岐させるマスターコントローラー
‘ =================================================================================

Public Sub ExecuteCrossVersionTask()
Dim acadVer As Double
acadVer = GetAutoCADInternalVersion()

‘ デバッグ用:現在のバージョンを出力
Debug.Print “検知されたAutoCAD内部バージョン: ” & acadVer

‘ バージョンに応じた処理の分岐
Select Case acadVer
Case Is < 24.0 ' AutoCAD 2020 以前のレガシー環境向け処理 Call ExecuteForLegacyEnvironment Case 24.0 To 24.2 ' AutoCAD 2021 ~ 2023 中期モダン環境向け処理 Call ExecuteForMidModernEnvironment(acadVer) Case Is >= 24.3
‘ AutoCAD 2024 以降の最新環境向け処理(最先端機能の解放)
Call ExecuteForLatestEnvironment

Case Else
‘ 未知の将来バージョン、または想定外の環境
MsgBox “警告: 未知の実行環境です(Version: ” & acadVer & “)。一部の処理がスキップされる可能性があります。”, vbExclamation, “環境チェック”
Call ExecuteForLegacyEnvironment ‘ フェイルセーフとして最小限の処理を実行
End Select

End Sub

‘ ——————————————————————————–
‘ 内部バージョンを取得する堅牢なラッパー関数
‘ ——————————————————————————–
Private Function GetAutoCADInternalVersion() As Double
On Error GoTo ErrorHandler

Dim rawVersion As String
rawVersion = ThisDrawing.Application.Version

‘ 文字列から数値(Double)へ安全に変換
GetAutoCADInternalVersion = Val(rawVersion)
Exit Function

ErrorHandler:
‘ 万が一Applicationオブジェクトにアクセスできない場合のフォールバック
MsgBox “致命的なエラー: AutoCADアプリケーションのバージョンを取得できません。”, vbCritical, “システムエラー”
GetAutoCADInternalVersion = 0#
End Function

‘ ——————————————————————————–
‘ 環境別の実処理プロシージャ(Stub)
‘ ——————————————————————————–
Private Sub ExecuteForLegacyEnvironment()
MsgBox “レガシーモードで実行します。基本機能のみで処理を継続します。”, vbInformation
‘ レガシー環境用のロジックをここに記述
End Sub

Private Sub ExecuteForMidModernEnvironment(ByVal ver As Double)
MsgBox “モダン環境(Version ” & ver & “)で実行します。”, vbInformation
‘ 2021〜2023向けのロジックをここに記述
End Sub

Private Sub ExecuteForLatestEnvironment()
MsgBox “最新環境(2024+)専用の高パフォーマンス処理を実行します。”, vbInformation
‘ 2024以降でしか使えない最新メソッドをここに記述
‘ 例: ThisDrawing.Application.ActiveDocument.NewModernFeature()
End Sub

4. チーフアーキテクトからの実務アドバイス:保守性を高める設計思想

現場で長期間運用されるマクロを書くにあたり、以下の鉄則を忘れないでほしい。

① マジックナンバーをコード内に散りばめない

今回のサンプルでは分かりやすく `24.3` などの数値を直接 `Select Case` に書いたが、大規模な開発ではこれらを定数(Const)としてモジュールの最上部に定義すべきだ。

Private Const ACAD_VER_2021 As Double = 24.0
Private Const ACAD_VER_2024 As Double = 24.3

こうしておけば、将来AutoCAD 2026が出たときも、定数の書き換えと分岐の追加だけでコードベースの健全性を保てる。

② ファイル連携やデータベース連携への応用

バージョン差異の問題は、AutoCADのオブジェクト操作だけに留まらない。例えば、出力する図面ファイル形式(DWGの保存バージョン:`acR18Drawing` など)を動的に切り替える際にも、この `Version` プロパティによる判定が極めて有効に働く。古いバージョンのAutoCADに、新しい図面形式でデータを無理やり保存させようとして起きるI/Oエラーを、コードレベルで完全に根絶できるのだ。

5. まとめ

AutoCAD VBAにおいて、環境を制する者が自動化を制す。
「どの端末でも同じように動く」という当たり前を実現するためには、運に頼るのではなく、`AcadApplication.Version` を用いた精緻な環境検知と設計が必要不可欠だ。

今日からあなたのコードにこのバージョン判定を取り入れ、環境依存のトラブルに怯える日々を終わらせてほしい。君たちの手で、最高に堅牢な業務自動化ツールを作り上げてくれ。

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