AutoCAD VBAを掌握する:複数バージョン共存環境における「実行エンジン」の動的制御術
AutoCADのプロジェクトを率いていると、避けて通れないのが「バージョン地獄」だ。
「現場のDWGは2018形式だが、社内規定で2024で開け」「いや、このアドオンは2021でしか動かない」といった要求は、もはや日常茶飯事だろう。
多くのエンジニアが `CreateObject(“AutoCAD.Application”)` を安易に叩き、その時たまたまWindowsレジストリで「最後にインストールされた(あるいは起動した)」バージョンが立ち上がるという、運任せの自動化を放置している。
プロフェッショナルであれば、図面のバージョン要件に応じて、最適なAutoCADインスタンスを「自律的に」選択し、制御下に置く必要がある。今回は、その極限の制御手法を伝授する。
—
1. なぜ「CreateObject」だけでは不十分なのか
`CreateObject` は、ProgID(例: `AutoCAD.Application`)を投げればOSがよしなに処理してくれる便利な関数だ。しかし、これは「今どのバージョンがデフォルトか」という不確かな状態に依存する。
堅牢な自動化ツールを目指すなら、以下の設計思想が不可欠である。
1. バージョン情報の直読み: DWGのヘッダを読み、必要なCADエンジンを逆引きする。
2. ProgIDの動的生成: `AutoCAD.Application.24` のように、バージョン指定付きのProgIDを動的に生成してインスタンスを起動する。
3. ライフサイクル管理: 起動したプロセスが「ゾンビ化」しないよう、確実な終了処理(`Quit`メソッドとオブジェクト解放)を実装する。
—
2. 実装:DWGバージョン判定と実行エンジン制御
以下のコードは、指定したDWGファイルのバージョンを判別し、適切なAutoCADエンジンを選択して起動するプロフェッショナルなテンプレートだ。
Option Explicit
‘ プロダクションレベルのCAD起動ルーチン
Public Sub OpenDrawingWithOptimalVersion(ByVal dwgPath As String)
Dim targetVersion As String
Dim progID As String
Dim acadApp As Object
‘ 1. DWGのバージョンを確認(簡易判定メソッドを想定)
targetVersion = GetDwgVersion(dwgPath)
‘ 2. バージョンに基づいたProgIDを生成
‘ AutoCAD 2024 = 24.3, 2023 = 24.2, 2022 = 24.1, 2021 = 24.0 など
progID = “AutoCAD.Application.” & targetVersion
On Error Resume Next
‘ 特定バージョンのインスタンスを試行
Set acadApp = GetObject(, progID)
If acadApp Is Nothing Then
Set acadApp = CreateObject(progID)
End If
On Error GoTo 0
If acadApp Is Nothing Then
MsgBox “指定されたバージョンのAutoCADが見つかりません。”, vbCritical
Exit Sub
End If
‘ 3. アプリケーションの制御
acadApp.Visible = True
acadApp.Documents.Open dwgPath
‘ メモリリーク防止のため、最後にNothingを明示
Set acadApp = Nothing
End Sub
‘ DWGの先頭数バイトから形式を判定する(バイナリ読込)
Private Function GetDwgVersion(ByVal path As String) As String
‘ ここでDWGのヘッダ(AC1032等)を読み取り、対応するProgIDのサフィックスを返す
‘ 実際の実務では、ファイルサイズが大きいためバイナリ読み込み専用の
‘ 軽量なストリーム処理を推奨する。
GetDwgVersion = “24.3” ‘ 例: 2024
End Function
—
3. 運用上の「陥りやすい罠」と対策
① プロセス・ゾンビ問題
VBAで `CreateObject` したAutoCADが、終了時にバックグラウンドで残り続ける現象がある。これを防ぐには、処理終了時に `acadApp.Quit` を明示的に呼ぶこと。また、`On Error` 発生時でも確実に `Set = Nothing` が通るような構造にしなければならない。
② COMマーシャリングのオーバーヘッド
大量の図面を処理する場合、毎回 `CreateObject` しては `Quit` を繰り返すとパフォーマンスが著しく低下する。「1つのAutoCADインスタンスを使い回し、ドキュメントだけを開閉する」というオブジェクトの再利用設計が、処理時間を劇的に短縮する鍵だ。
③ データベース連携時の注意点
CAD図面から抽出したデータをSQL ServerやExcelへ書き出す際、AutoCADのバージョンによって `AcDb` ライブラリの参照設定が異なることがある。VBAの「参照設定」に頼らず、遅延バインディング(Object型)で記述するのが、複数バージョン共存環境での唯一の正解だ。
—
最後に:エンジニアとしての矜持
AutoCADの自動化は、単なるコードの集まりではない。それは環境という名の「揺らぎ」を、いかに論理的な構造で封じ込めるかという挑戦である。
「動けばいい」というコードは、数ヶ月後のアップデートで必ず破綻する。今日紹介した「ProgIDの動的制御」と「オブジェクトのライフサイクル管理」を徹底すれば、あなたの自動化ツールは、どんな環境下でも安定して動作する堅牢なインフラへと進化するはずだ。
技術は、使う側が支配しなければならない。さあ、次はどの無駄な手作業を自動化し、創造的な時間を取り戻そうか。
