AutoCAD VBAを掌握する:図面オープン・保存の「真実」と互換性の罠
AutoCADの自動化において、`Documents.Open` は単なるファイルの読み込みではない。それは、AutoCADという巨大なメモリ空間に「図面データベース(Database)」をロードし、制御権をVBAに移譲する極めて重厚なプロセスだ。
多くの初心者が「とりあえず動くコード」を書いてバグに直面する。なぜか? それは、図面のライフサイクルと、背後にあるDXF/DWGフォーマットの世代間ギャップを無視しているからだ。
今日は、現場で生き残るための「堅牢な図面操作」の作法を伝授する。
—
1. なぜ「最新版DWG」を「旧バージョン」で開いてはいけないのか
AutoCADの図面ファイル(DWG)は、バージョンごとに内部スキーマが異なる。2024形式のDWGを2018形式で開こうとすれば、AutoCADは「解釈不能なデータ」を前にエラーを吐くか、プロキシオブジェクトとして処理するしかない。
実務における絶対原則:
- 前方互換性はない: 古いAutoCADで新しい形式のファイルは開けない。
- 後方互換性の代償: 最新版で旧形式として保存することは可能だが、注釈尺度や新規機能が損なわれるリスクがある。
これらを理解せず、`Documents.Open` を単発で実行し続けるツールは、現場で「ファイルが開けません」という悲鳴を上げる。
—
2. 堅牢な「オープン処理」のプロダクションコード
初心者は `Documents.Open` を書くだけだが、プロは「ファイルが既に開かれていないか」「読み取り専用ではないか」「ファイルは存在するか」という例外処理を必ず実装する。
以下は、実務でそのまま使える、エラーを握りつぶさない堅牢な設計のサンプルコードだ。
‘ @description: 安全かつ確実に図面を開くためのラッパー関数
‘ @param filePath: 開きたいDWGのフルパス
Public Function OpenDrawingSafe(ByVal filePath As String) As AcadDocument
Dim doc As AcadDocument
‘ 1. ファイルの存在確認(基本中の基本)
If Dir(filePath) = “” Then
Err.Raise vbObjectError + 1, “OpenDrawingSafe”, “指定されたパスにファイルが見つかりません: ” & filePath
End If
‘ 2. 既に開かれているかチェック(重複オープンによるメモリ負荷を回避)
For Each doc In Application.Documents
If UCase(doc.FullName) = UCase(filePath) Then
Set OpenDrawingSafe = doc
Exit Function
End If
Next doc
‘ 3. 図面を開く(ReadOnlyモード等のオプションは環境に応じて指定)
‘ ※注意: 最新ファイルを旧版で開こうとするとここでVBAが停止するため
‘ 呼び出し元でOn Error Resume Nextを使うより、事前にバージョン判定を行うのがベスト
Set OpenDrawingSafe = Application.Documents.Open(filePath)
End Function
—
3. バージョン互換制御の核心:SaveAsによる「変換」
もしあなたが「最新の図面を、協力会社や古いシステムのために古いDWG形式で保存したい」という課題に直面しているなら、単に開くだけでは不十分だ。`SaveAs` メソッドの第2引数(Version)を制御せよ。
‘ @description: 現在の図面を特定のバージョンで保存する
‘ @param savePath: 保存先パス
‘ @param version: ターゲットとするAcSaveAsType
Public Sub SaveAsLegacy(ByVal savePath As String, ByVal version As AcSaveAsType)
On Error GoTo ErrHandler
‘ 例: ac2010_DWG, ac2013_DWG など、必要な形式を指定
ThisDrawing.SaveAs savePath, version
Exit Sub
ErrHandler:
MsgBox “保存失敗: ” & Err.Description, vbCritical
End Sub
【プロの知見】バージョン制御の落とし穴
`AcSaveAsType` で古いバージョンを指定して保存する場合、「現在の図面内に古いバージョンでは解釈できないデータ(注釈尺度など)が含まれていないか」を事前に検証しなければならない。もし不明な場合は、一度 `Audit` コマンド相当の処理を挟むか、警告ログを出力する設計を強く推奨する。
—
4. 最後に:エンジニアとしてのマインドセット
AutoCAD VBAは、いわば図面の「心臓部」を直接操作する外科手術だ。
コードを書く際は、以下の3点を常に意識してほしい。
1. 「ファイルが開いていない」という状態はあり得る: 常に `Dir` 関数で存在を確認すること。
2. メモリを解放せよ: 大量にファイルを開閉するツールを作る場合、`ThisDrawing.Close` やオブジェクトの `Nothing` 代入を怠れば、AutoCADは確実にメモリリークを起こす。
3. UIに頼るな: `Application.Documents.Open` は強力だが、バックグラウンドでのバッチ処理なら、`ObjectDBX`(AxDbDocument)の使用も検討せよ。これを使えば、図面を画面に表示せず高速にデータベース操作ができる。
これこそが、AutoCADを「操作」するのではなく「制圧」するエンジニアの視点だ。明日からの開発で、ぜひこの堅牢性を実装してほしい。成功を祈る。
