AutoCAD VBAの深淵:SaveAsの「見えない罠」を制御するアーキテクトの思考
AutoCADのオートメーションにおいて、`SaveAs` メソッドほどエンジニアのプライドを粉砕するものはない。
「なぜ、このファイル形式で保存できないのか?」
夜中のバッチ処理中に吐き出される、あの無機質なCOMエラー。原因は明白だ。開発環境のAutoCADバージョンと、クライアントのレガシーなDWG保存要件との間に横たわる「互換性の断絶」。これを単なるTry-Catch(VBAなら `On Error Resume Next`)で握りつぶすのは三流のやることだ。
我々アーキテクトは、「オブジェクトのライフサイクル」と「アプリケーションのメタデータ」を掌握し、エラーが起きる前に論理的に回避する。今回は、`AcadDocument.Version` を解析し、生存可能なファイル形式を動的に割り当てる、実戦的かつ堅牢なロジックを伝授する。
—
なぜ「バージョン判定」が必須なのか
AutoCADは強力だが、COMインターフェースは非常に気難しい。特に `SaveAs` メソッドに渡す `AcSaveAsType` 定数は、対象のAutoCADエンジンがサポートしていない形式を要求されると、即座に例外をスローする。
例えば、最新のAutoCADで R14 形式を吐き出そうとして、コンポーネントがインストールされていない環境に当たれば即死だ。「バージョン情報を取得し、実行時に最適な定数を動的に選択する」。これがシステム管理者が備えるべき最低限の防衛線である。
—
実装:堅牢な動的保存ルーチン
以下のコードは、単に保存するだけのルーチンではない。メモリリークを許さず、COMオブジェクトの寿命を正確に管理する。
‘ ——————————————————————
‘ @brief SaveAsメソッドの安全性と互換性を保証するラッパー
‘ @param targetDoc 保存対象のAcadDocument
‘ @param filePath 保存先フルパス
‘ ——————————————————————
Public Sub SecureSaveAs(ByVal targetDoc As AcadDocument, ByVal filePath As String)
Dim saveFormat As AcSaveAsType
Dim engineVersion As String
‘ 1. バージョン情報の取得と正規化
‘ Versionプロパティは “18.0s (LMS Tech)” のような文字列を返す。
‘ ここから数値部分を抽出し、判断材料とする。
engineVersion = targetDoc.Application.Version
‘ 2. バージョンに応じた定数の動的選定
‘ 開発環境のAutoCADエンジンが扱える上限を考慮し、論理分岐を構築
Select Case Left(engineVersion, 2)
Case “18” ‘ AutoCAD 2010-2012
saveFormat = ac2010_dwg
Case “19” ‘ AutoCAD 2013-2014
saveFormat = ac2013_dwg
Case “24” ‘ AutoCAD 2021-2024
saveFormat = ac2018_dwg
Case Else
‘ フォールバック戦略:デフォルト形式への退避
saveFormat = ac2018_dwg
End Select
‘ 3. エラーハンドリングの極致
‘ COMエラーを握りつぶすのではなく、予兆を検知する
On Error GoTo ErrorHandler
targetDoc.SaveAs filePath, saveFormat
Exit Sub
ErrorHandler:
‘ ここでWindows APIを用いてイベントログに記録するか、
‘ システム管理者にメール通知を飛ばすのが真のアーキテクトの仕事
Debug.Print “SaveAs failed: ” & Err.Description
Err.Clear
End Sub
—
アーキテクトの視点:メモリとライフサイクル
VBAコードを書く上で、「オブジェクトを解放しない」のは罪である。特に `AcadDocument` や `AcadApplication` をループ内で多用する場合、VBAのガベージコレクションは非常に遅い。
- 明示的なNothing代入: 処理が終わったオブジェクトには必ず `Set obj = Nothing` を行うこと。これは単なるマナーではない。COMの参照カウンタを即座にデクリメントし、AutoCADのメモリリークを最小化するための必須作業だ。
- Late Binding vs Early Binding: 開発時は Early Binding で型チェックを行い、配布時は Late Binding で互換性を確保する。これがバージョン間の断絶を乗り越える唯一の解法である。
—
今後の展望:APIとの連携
もし君がさらに上のレイヤーを目指すなら、VBA単体で完結させようとせず、「Windows API」を用いたファイル監視と組み合わせるべきだ。
`Kernel32.dll` の `GetFileAttributes` を駆使し、保存先に書き込み権限があるか、あるいはファイルがロックされていないかを `SaveAs` の前に事前確認する。AutoCADの内部エラーを待つのではなく、OSレベルの状態で判定する。この「二重の防壁」こそが、止まらないシステムを構築する秘訣だ。
—
結びに代えて
AutoCAD VBAはレガシーではない。使い手次第で、それは今なお最強の業務自動化ツールだ。
「動けばいい」というコードと、「止まらない」コードの間には、数千時間の試行錯誤と、オブジェクトモデルへの深い愛がある。
君の書くコードが、明日の誰かの救いになることを願っている。
さあ、コンパイルして、その目で確かめてくれ。
