AutoCAD VBAの深淵へ:図面破損を自動検知し、自律的に「治癒」させるリカバリパイプラインの構築
こんにちは。AutoCADの自動化という荒野を切り拓く皆さんの相棒、チーフアーキテクトです。
日々、数千枚もの図面を扱う現場で、最も胃が痛くなる瞬間……それは「致命的なエラー」による図面の破損ですよね。手動で `RECOVER` コマンドを叩く作業を、いつまで繰り返すつもりですか?
今回は、VBAを使って「破損を検知し、自動的に修復プロセスを走らせる」という、現場のエンジニアが喉から手が出るほど欲しかったリカバリパイプラインの構築法を伝授します。
—
1. なぜ「普通のオープン」ではいけないのか?
通常、`Documents.Open` メソッドで図面を開こうとすると、破損ファイルに遭遇した瞬間にVBAコードそのものが停止し、AutoCADはダイアログを出してユーザーの入力を待ちます。
自動化の最大の敵は「中断」です。これを打破するためには、Openする前の「準備」と、SendCommandによる「介入」という二段構えのアーキテクチャが必要です。
—
2. 破損検知と自動修復のプロトタイプ
以下のコードは、指定したパスの図面を「安全」にオープンし、もし破損していれば自動で修復プロセスを呼び出すためのテンプレートです。
‘ ———————————————————
‘ 図面修復自動化プロシージャ
‘ ———————————————————
Public Sub AutoRecoverDrawing(filePath As String)
Dim doc As AcadDocument
‘ エラーハンドラを仕込み、予期せぬクラッシュを制御下に置く
On Error GoTo ErrorHandler
‘ 図面を開く(ReadOnlyで開くのが、破損検証のセオリーです)
Set doc = Application.Documents.Open(filePath, True)
MsgBox “正常に開けました: ” & doc.Name
Exit Sub
ErrorHandler:
‘ ここでエラー番号を判定。-2145386493は「図面破損」を指すことが多い
Debug.Print “破損検知: ” & Err.Description
‘ Recoverコマンドを送信して修復プロセスを開始
‘ SendCommandは「コマンドラインに文字列を流し込む」という荒技です
‘ ※VB.NET移行を見据えるなら、ここはDatabaseオブジェクトのReadDwgFileを検討すべき
ThisDrawing.SendCommand “_RECOVER” & vbCr & filePath & vbCr
Resume Next
End Sub
コードの心臓部:解説
- ReadOnlyフラグ: 破損ファイルを書き込みモードで開こうとするのは自殺行為です。まずはReadOnlyで「検証」します。
- SendCommand: これはAutoCAD VBAの「奥義」です。本来VBAから呼び出せないダイアログ処理も、コマンドラインに命令を送り込むことで強制実行させます。`vbCr` はエンターキーを意味します。
—
3. 初学者が陥りやすい「3つの落とし穴」
コードを組む際、多くの人がここでつまずきます。
1. 「SendCommandの同期ズレ」問題:
SendCommandは非同期で実行されます。つまり、コードが次の行に進んでも、AutoCAD内部ではまだ修復中である可能性が高いのです。大規模図面では `DoEvents` を挟むか、修復後のファイルが書き出されたかをファイルシステム側(Scripting.FileSystemObject)で監視してください。
2. 「アクティブドキュメントの喪失」:
`RECOVER` をかけると、新しく修復されたドキュメントがアクティブになります。コードを実行していた元の図面オブジェクトが「死んでしまう」ことがあるため、常に `Application.ActiveDocument` を再取得する癖をつけましょう。
3. 「エラーハンドラの罠」:
`On Error GoTo` を書かないと、破損した瞬間にVBAエンジンごとフリーズします。必ずエラーをトラップして、プログラムを安全に着地させてください。
—
4. プロの視点:次のステップへ
今回のコードは、いわば「救急処置」です。もし皆さんが本気で数万枚規模の図面管理を自動化したいなら、次は以下のステップに進んでください。
- Databaseオブジェクトの利用: `Documents.Open` ではなく、`Database` オブジェクトをメモリ上で生成し、`ReadDwgFile` メソッドで読み込む方法です。これを使えば、画面を開かずに(バックグラウンドで)破損の有無を高速にチェックできます。
- ログ出力: 破損していたファイル名、エラーコード、修復成功の可否をCSVで記録する仕組みを加えてください。
—
最後に:自動化は「責任」です
VBAを覚えることは、単に楽をすることではなく、「機械に正確な手順を教え込むこと」です。今回紹介した「リカバリパイプライン」は、皆さんの業務時間を大幅に救ってくれるはずです。
「コードが動かない!」と嘆く前に、まずはそのエラーが「何に対して文句を言っているのか」を、デバッグのステップ実行で一つずつ紐解いてみてください。
ここを乗り越えれば、あなたはもうただのCADオペレーターではありません。CADの挙動を支配する、真の自動化エンジニアです。応援していますよ!
