【実務・中級編】【上級】複数バージョンのAutoCADが共存する環境で、特定のバージョンを指定してAcadApplicationを起動 – AutoCAD VBA解析バイブル

スポンサーリンク

【上級】複数バージョンのAutoCAD共存環境を制圧する:バージョン指定によるAcadApplication起動の極意

開発現場でAutoCAD VBAや外部COMオートメーションを扱う際、最も恐ろしいトラブルの一つが「意図しないバージョンのAutoCADが起動する、あるいはアタッチされる」という現象だ。

クライアントのPCに、AutoCAD 2022、2024、そして最新の2025が同居しているとする。ここで、あなたが2024のAPI仕様(新機能や特定のバグ修正)を前提に組んだツールを動かしたとき、COMの遅延バインディングや曖昧なProgID指定によってバックグラウンドで2022が立ち上がったらどうなるか?

――結果は、言うまでもなく「Automation Error(オートメーション エラー)」の蜂の巣である。

今回は、複数バージョンが混在するカオスな環境下において、完全に意図したバージョンのAutoCADインスタンスを掌握し、暴走を防ぐための「堅牢な起動制御のアーキテクチャ」を伝授する。

なぜ `CreateObject(“AutoCAD.Application”)` は悪手なのか?

多くの初心者が書いてしまう、あるいはネットのサンプルコードにありがちなのがこの記述だ。

‘ 【アンチパターン】絶対にやってはいけない書き方
Dim acadApp As Object
Set acadApp = CreateObject(“AutoCAD.Application”)

このコードの何が問題か。
レジストри(HKEY_CLASSES_ROOT\AutoCAD.Application)には、「最後にインストール(またはアクティブ化)されたAutoCADのバージョン」へのポインタが上書きされる仕様になっている。つまり、ユーザが別のバージョンのAutoCADを起動したり、パッチを当てたりした瞬間に、このコードが指す実体は静かに、そして勝手にすり替わる。

プロダクション環境において、このような「環境依存の不確定要素」を放置することはプロの仕事ではない。我々は、バージョン番号をハードコーディング、あるいは動的に完全コントロールしなければならない。

ProgIDのバージョン指定による厳密な制御

AutoCADのCOMサーバーは、バージョンごとに固有のProgIDを持っている。

  • AutoCAD 2022: `AutoCAD.Application.24`
  • AutoCAD 2023: `AutoCAD.Application.24.1`
  • AutoCAD 2024: `AutoCAD.Application.24.2`
  • AutoCAD 2025: `AutoCAD.Application.25`

このように、メジャーバージョンおよびマイナーバージョンに対応するサフィックスを付与したProgIDを `CreateObject` に渡すことで、OSに対して「どのバージョンのEXECUTABLEをロードすべきか」を強制指定できる。

‘ AutoCAD 2024を指定して確実に起動する例
Dim acadApp As Object
Set acadApp = CreateObject(“AutoCAD.Application.24.2”)

しかし、実務の現場では「指定したバージョンがそのPCにインストールされているとは限らない」「すでに起動しているインスタンスにアタッチ(GetOject)したい」といった要件が絡み合う。ここからが本題だ。

【プロダクションコード】多重起動・バージョン不一致を防ぐ堅牢なファクトリー関数

実務でそのまま使える、堅牢なAutoCADアプリケーション取得モジュールを提示する。
このコードは、指定バージョンの有無をチェックし、必要に応じて新規起動、あるいは既存インスタンスの制御を行う設計(Singletonパターンに近いアプローチ)を取り入れている。

Option Explicit

” =================================================================
” 模範解答:バージョン指定型 AutoCAD アプリケーション取得モジュール
” =================================================================

‘ 指定したバージョンのAutoCADオブジェクトを取得(または新規起動)する
Public Function GetAutoCADApplication(ByVal targetVersion As String, Optional ByVal visible As Boolean = True) As Object
Dim progID As String
Dim acadApp As Object

‘ バージョン文字列に応じたProgIDの組み立て
‘ 例: targetVersion = “24.2” なら “AutoCAD.Application.24.2”
progID = “AutoCAD.Application.” & targetVersion

On Error Resume Next

‘ 1. すでに起動中の同版本インスタンスが存在するかチェック (GetElapsed/GetObjectの代替)
‘ ※厳密にバージョンを特定してGetActiveObjectを行うのはCOMの仕様上難しいため、
‘ まずはCreateObjectで「新規起動または既存アクティブへのバインド」を試みる
Set acadApp = CreateObject(progID)

If Err.Number <> 0 Then
‘ エラーハンドリング:指定したバージョンがPCに存在しない、またはレジストリ異常
On Error GoTo 0
Err.Raise vbObjectError + 1000, “GetAutoCADApplication”, _
“指定されたバージョン (” & targetVersion & “) のAutoCADが見つかりません。インストール状況を確認してください。”
Exit Function
End If

On Error GoTo 0

‘ 可視性の設定
acadApp.Visible = visible

‘ 呼び出し元へ返却
Set GetAutoCADApplication = acadApp

Set acadApp = Nothing
End Function

‘ — 実行用サンプルプロシージャ —
Sub Sample_LaunchAutoCAD2024()
Dim acApp As Object
Dim acDoc As Object

On Error GoTo ErrorHandler

‘ AutoCAD 2024 (Internal Version: 24.2) を指定して起動
Set acApp = GetAutoCADApplication(“24.2”, True)

Debug.Print “接続成功: ” & acApp.Name & ” (” & acApp.Version & “)”

‘ 新規図面の作成例
Set acDoc = acApp.Documents.Add()

‘ 業務処理をここに記述…

MsgBox “AutoCAD 2024の制御に成功しました。”, vbInformation
Exit Sub

ErrorHandler:
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical
If Not acApp Is Nothing Then Set acApp = Nothing
End Sub

開発現場の知見:ファイル・データベース連携における「暗黙のトラップ」

複数バージョン環境でAutoCADをAPI経由(VBAや外部VB.NET/C#)で操作し、社内データベースやExcelから図面を一括処理するシステムを構築する際、以下の罠に必ず直面する。

1. データベース(MDB/SQL Server等)とのトランザクション整合性

古いバージョンのAutoCADエンジンがバックグラウンドでクラッシュした際、COMプロセスのゾンビ化(プロセスがタスクマネージャーに残る現象)が発生する。これが起きた状態で次のバッチ処理を走らせると、意図しない古いプロセスがDBのレコードをロックし続け、データ連携が沈黙する

  • 対策: 処理の前後で `AcadApplication.Quit` を確実に実行し、オブジェクト変数を `Nothing` に解放するだけでなく、必要に応じて `TaskKill` コマンド等で不正に残った `acad.exe` プロセスをクリーンアップする防衛的コードを挟むこと。

2. 図面ファイル(DWG)の「知らぬ間のバージョンアップ保存」

AutoCAD 2025のAPIで古いDWG(例: AutoCAD 2013形式)を開き、VBAから `.Save` メソッドを叩いた場合、勝手に最新のファイルフォーマットに上書き保存されてしまうことがある。
下位バージョン(2018未満など)を指定している取引先や他部署へ成果物を納品するパイプラインの場合、これだけで大障害に発展する。

  • 対策: VBAから保存を行う際は、デフォルトの `Save` ではなく、フォーマットを指定可能な `SaveAs` メソッドを使い、保存するDWGのファイルフォーマット(例: `ac2018_dwg` など)を明示的にコード内で指定しなければならない。

チーフアーキテクトからの総括

複数バージョンの共存環境におけるAutoCADオートメーションは、一歩間違うと「開発者のローカル環境では動くが、本番のクライアントPCでは動かない」という最悪のデバッグ迷宮を生み出す。

  • `CreateObject(“AutoCAD.Application”)` は絶対に使わない。
  • バージョンサフィックス(`.24.2` 等)を明示し、環境の揺らぎをコードでねじ伏せる。
  • プロセスのライフサイクル(生成・アタッチ・解放・破棄)を完全に掌握する。

この3原則を遵守すれば、どんなにカオスなマルチバージョン環境であっても、あなたの自動化ツールは常に気高く、正確無比に動作し続けるはずだ。コードの意図を理解し、現場の信頼を勝ち取る強靭なツールを組み上げてほしい。

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