AutoCAD VBAを掌握する:図面破損の自動検知と「無人リカバリパイプライン」の構築
AutoCADの運用において、最も忌むべき存在は「致命的なエラー」による突然のクラッシュだ。特に数千枚単位の図面を扱う自動化環境において、一つでも破損したDWGに遭遇すれば、パイプライン全体が停止する。
甘い開発者は「エラーハンドラでスキップすればいい」と考える。しかし、それは死を先送りにしているに過ぎない。本稿では、AutoCADの内部データベースの整合性を守り、破損図面を検知した瞬間にリカバリプロセスを走らせる「堅牢な自動修復アーキテクチャ」を伝授する。
—
1. なぜ既存の「オープン」では不十分なのか
通常の `Documents.Open` は、図面が破損していると即座に例外を投げ、VBAコードそのものを強制終了させる。これでは、バックグラウンドでのバッチ処理は成立しない。
我々が目指すべきは、「図面を開く前に異常を察知し、必要であれば `RECOVER` コマンドで強制的に再構成させる」という非同期的な制御だ。
2. 破損検知の設計思想:ファイルロックとDB検証
AutoCADの内部データベースを壊さないための鉄則は、「直接開くことへの依存を捨てる」ことだ。
戦略の要点
- ファイルシステムによる事前スクリーニング: ファイルサイズが極端に小さい、あるいはロックファイル(.dwl)が異常な状態で残存しているかを確認する。
- SendCommandの「擬似同期」: `Open` は不安定だが、コマンドライン経由の `RECOVER` はAutoCADのセーフティモードを強制的に起動させるため、最も信頼性が高い。
—
3. 実装:自動修復パイプラインのプロダクションコード
以下のコードは、破損を検知した際に自律的に修復プロセスへ移行する、現場でそのまま使える設計だ。
‘ 【AutoCAD VBA】堅牢な図面修復パイプライン
‘ このルーチンは、Openエラーを回避し、破損図面を自動修復プロセスに回す
Public Sub OpenDrawingWithRecovery(ByVal filePath As String)
Dim doc As AcadDocument
‘ 1. ファイルの存在確認(最低限の防御)
If Dir(filePath) = “” Then
Debug.Print “Error: File not found: ” & filePath
Exit Sub
End If
On Error GoTo RecoveryRequired
‘ 2. 通常のオープンを試行
Set doc = Application.Documents.Open(filePath)
‘ 3. 正常に開けた場合はここで終了
Exit Sub
RecoveryRequired:
‘ エラーが発生した場合、コマンドライン経由でリカバリを試みる
Debug.Print “図面破損を検知: ” & filePath
Err.Clear
On Error GoTo 0
‘ 4. RECOVERコマンドの実行
‘ SendCommandは同期的に振る舞うが、コマンドが完了するまで待機が必要な場合がある
‘ その場合はDoEventsを組み合わせるか、遅延実行を検討せよ
Application.ActiveDocument.SendCommand “_RECOVER” & vbCr & filePath & vbCr
‘ 注意: この後の処理はリカバリが完了した後に実行されるよう、
‘ イベントハンドラ(DocumentActivate等)と連携させるのがベストプラクティスである
End Sub
—
4. プロフェッショナルが守るべき「3つの鉄則」
現場でバグを出さないために、以下の規律を徹底してほしい。
① `SendCommand` の呼び出し順序に気を配れ
`SendCommand` は非同期的に動作する。修復後のファイルを即座に編集しようとすると、まだ修復が終わっていない図面にアクセスしてしまい、二重のクラッシュを招く。必ず `Document.Name` の変化や `DocumentActivate` イベントをフックして、修復完了を検知すること。
② 大量処理時は `Application.DocumentManager` を活用せよ
VBAの `Documents` コレクションは、巨大な図面を扱う際、メモリリークの温床になりやすい。処理が終わるごとに `doc.Close False` で確実にメモリを解放し、ガベージコレクションを促す設計にせよ。
③ データベース連携時のトランザクション管理
修復後の図面にデータベース(外部エクセルやSQL等)をリンクさせる際は、修復によってオブジェクトIDが再割り当てされる可能性があることを忘れてはならない。「修復後は必ずリンク情報を再構築する」というフローを組み込むのが、真に堅牢なシステムの証明だ。
最後に:エンジニアとしての誇り
AutoCADの自動化において、コードの美しさは「いかにエラーを避けるか」ではなく、「いかにエラーと共存し、それを自動で処理し切るか」に宿る。
本稿で紹介したリカバリパイプラインは、小手先の技術ではない。貴殿が構築するシステムが、深夜のバッチ処理中に誰の手も借りず、破損した図面を自ら修復し、業務を完遂させることを願っている。
コードを信じるな。アーキテクチャを信じろ。それが、プロフェッショナルの仕事だ。
