こんにちは!AutoCADの自動化の世界へようこそ。
日々、膨大な図面を相手に奮闘していることと思います。「マクロの記録」から一歩踏み出し、自分だけの自動化ツールを作り始めると、AutoCAD VBAの奥深さと強力さに魅了されますよね。
今回は、現場のプロが必ず直面する「複数バージョンが共存するPC環境での、COM参照の動的解決とオープン制御」という、少しマニアックだけど絶対に避けて通れないテーマを解説します。
「複数のAutoCADが入っていると、なぜか意図しない古いバージョンが起動してしまう…」
「バージョン違いのPCに配ったら、型不一致エラー(Error 429)で動かなくなった…」
そんな現場のトラブルを綺麗に解決し、どの環境でも狙ったバージョンのAutoCADを自在に操るための極意を、優しく紐解いていきましょう。ここをクリアすれば、あなたのVBAスキルは間違いなくワンランク上の「プロフェッショナル領域」に到達しますよ!
—
1. なぜ複数バージョン環境でトラブルが起きるのか?
皆さんの開発PCや職場の端末には、AutoCAD 2022、2023、2024……といった複数のバージョンが同居していませんか?
通常、VBAの「参照設定」で特定のライブラリ(例: AutoCAD 2023 Type Library)をチェックしてコードを書くと、そのコードは「2023専用」になります。これを「早期バインド(Early Binding)」と呼びます。
‘ 【早期バインドの例】参照設定が固定されるため、他バージョンで動かないリスクがある
Dim acadApp As AutoCAD.AcadApplication
Set acadApp = New AutoCAD.AcadApplication
この方法の恐ろしいところは、PCにAutoCAD 2024しか入っていない環境や、逆に2022しか入っていない環境で実行した瞬間、「オブジェクトを作成できません (Error 429)」という冷酷なエラーを吐いて沈黙してしまう点です。
実務で使うツールなら、環境を選ばず、そのPCに入っている最適なAutoCADを自動で見つけて起動してほしいですよね。それを実現するのが、今回学ぶ「遅延バインド(Late Binding)による動的解決」です。
—
2. 解決の鍵:遅延バインド(CreateObject)とProgIDの罠
オブジェクトの型をあらかじめ決めず、実行時に動的にインスタンスを生成する手法を「遅延バインド」と呼びます。これを使えば、参照設定のバージョン固定から解放されます。
しかし、ここでAutoCAD特有の「罠」があります。
一般的な `CreateObject(“AutoCAD.Application”)` という書き方。これ、実は複数のバージョンが入っている環境では「OSがレジストリから勝手に決めたバージョン(通常は最後にインストールされたものや、一番新しいもの)」が起動してしまいます。「本当は2022で開きたかったのに!」という制御ができません。
プロのエンジニアは、バージョンごとの「ProgID(プログラム識別子)」をコード内で指定し、意図したバージョンを正確に狙い撃ちします。
- AutoCAD 2022 なら `AutoCAD.Application.24.1`
- AutoCAD 2023 なら `AutoCAD.Application.24.2`
- AutoCAD 2024 なら `AutoCAD.Application.24.3`
(※バージョンごとのInternal VersionやProdIDの対応関係を把握しておくのが、シニアエンジニアの嗜みです)
—
3. 実践!バージョンを指定して図面を開く堅牢なコード
お待たせしました。ここからは、現場でそのままコピペして使える「バージョン共存対応&安全なオープン制御」のフルスクラッチコードをお見せします。
今回は、「指定したバージョンのAutoCADを確実に起動(または取得)し、特定のDWGファイルをサイレント(またはアクティブ)で開く」プロシージャを作成しました。
Option Explicit
‘ ==============================================================================
‘ 【上級プロフェッショナル向け】AutoCAD複数バージョン共存・動的オープン制御
‘ ==============================================================================
Public Sub OpenDrawingWithSpecificVersion()
Dim targetVersion As String
targetVersion = “2023” ‘ ← ここを変えるだけで起動するバージョンを制御できます (“2022”, “2023”, “2024”など)
Dim progID As String
progID = GetProgID(targetVersion)
If progID = “” Then
MsgBox “指定されたバージョン (” & targetVersion & “) のAutoCADは、このPCに登録されていません。”, vbCritical, “バージョンエラー”
Exit Sub
End If
Dim acadApp As Object
Dim acadDoc As Object
Dim dwgPath As String
dwgPath = “C:\Works\SampleDrawing.dwg” ‘ ← 開きたい図面のパスを指定してください
On Error GoTo ErrorHandler
‘ 1. 遅延バインドにより、指定バージョンのインスタンスを取得または新規起動
On Error Resume Next
Set acadApp = GetObject(, progID) ‘ 既に起動していれば取得
If acadApp Is Nothing Then
Set acadApp = CreateObject(progID) ‘ 起動していなければ新規作成
End If
On Error GoTo ErrorHandler
If acadApp Is Nothing Then
MsgBox “AutoCADのインスタンス生成に失敗しました。”, vbCritical
Exit Sub
End If
‘ 2. AutoCADウィンドウを表示状態にする
acadApp.Visible = True
‘ 3. 図面ファイルのオープン制御
‘ 既に同じファイルが開かれていないかチェックするなどのロジックを入れると完璧です
Set acadDoc = acadApp.Documents.Open(dwgPath)
MsgBox “AutoCAD ” & targetVersion & ” で図面を正常にオープンしました!”, vbInformation, “成功”
‘ クリーンアップ(オブジェクト変数の解放)
Set acadDoc = Nothing
Set acadApp = Nothing
Exit Sub
ErrorHandler:
MsgBox “予期せぬエラーが発生しました。” & vbCrLf & _
“エラー番号: ” & Err.Number & vbCrLf & _
“エラー内容: ” & Err.Description, vbCritical, “システムエラー”
Set acadDoc = Nothing
Set acadApp = Nothing
End Sub
‘ ——————————————————————————
‘ 補助関数: バージョン文字列から適切なProgIDを動的に返す
‘ ——————————————————————————
Private Function GetProgID(ByVal version As String) As String
Select Case version
Case “2022”: GetProgID = “AutoCAD.Application.24.1”
Case “2023”: GetProgID = “AutoCAD.Application.24.2”
Case “2024”: GetProgID = “AutoCAD.Application.24.3”
Case “2025”: GetProgID = “AutoCAD.Application.24.4”
Case Else: GetProgID = “” ‘ 未知のバージョン
End Select
End Function
—
4. コードの深掘りポイント(ここが分かればマスター!)
上記のコードで、初心者から一歩抜け出すための重要なポイントを解説します。
① `GetObject(, progID)` と `CreateObject(progID)` の使い分け
- `GetObject(, progID)`: 「今、すでにそのバージョンのAutoCADが裏で立ち上がっていませんか?」とOSに問いかけます。立ち上がっていれば、新しいプロセスを作らずに既存のインスタンスを再利用します(メモリの無駄遣いを防ぎ、PCのフリーズを防ぐプロの技です)。
- `CreateObject(progID)`: 立ち上がっていなければ、新しくそのバージョンのAutoCADを立ち上げます。
② なぜ `Dim acadApp As Object` なのか?
冒頭でも触れた「遅延バインド」の証拠です。あえて具体的な型(`AutoCAD.AcadApplication`)を指定せず、汎用的な `Object` 型にすることで、参照設定のチェックを一切不要にしています。
これにより、このマクロをExcelなどに組み込んで別環境のPCへ配っても、「参照設定が外れてコンパイルエラーになる」という悪夢を防ぐことができます。
—
5. 陥りやすい罠とデバッグのコツ
遅延バインドには素晴らしいメリットがある反面、1つだけ大きなデメリットがあります。それは「インテリセンス(入力補助のポップアップ)が効かない」ということです。
`acadApp.` と打っても、メソッドやプロパティの候補が出てきません。
【プロの回避策】
開発中(コードを書いている時)だけは、あえてVBEの「ツール」>「参照設定」から該当バージョンのType Libraryにチェックを入れ、コードを書き上げます。
そして、最終リリース(配布)の直前に、コードを `As Object` と遅延バインドの書き方に書き換え、参照設定のチェックを外すのです。この手順を踏めば、開発効率を落とさずに堅牢なコードが作れます。
—
おわりに
今回は、複数バージョンが共存する環境でのCOM参照の動적解決とオープン制御について解説しました。
「動かないかもしれない」という不安を排除し、コードの裏側で確実にバージョンをコントロールできるようになると、AutoCAD VBAを使った業務自動化の信頼性は劇的に向上します。
ここをクリアすれば、あなたはもうただの「マクロ使用者」ではありません。現場を支える立派なAutoCAD自動化エンジニアです。
ぜひ、あなたの現場の環境に合わせてコードをカスタマイズし、快適な自動化ライフを手に入れてくださいね。それでは、次のステップでお会いしましょう!
