こんにちは!AutoCAD VBAの世界へようこそ。
日々、膨大な図面と格闘していると、「いざ保存しようとしたら図面が破損していてエラーが出た……」「朝出社したら、昨日の作業データがパーになっていた……」なんていう、背筋が凍るようなトラブルに直面したことはありませんか?
私たちはつい「上書き保存(Ctrl + S)」の動作を信用しきってしまいますが、AutoCADの図面データベース(DWG)は、複雑な図形要素や外部参照、未知のゴミデータが絡み合うことで、知らず知らずのうちに内側からボロボロになっていく宿命を持っています。
今回は、マクロの記録から一歩抜け出し、「保存の直前に自動で図面を診断・修復し、ファイル破損のリスクを限界までゼロに近づける堅牢なワークフロー」の作り方を伝授します。
ここをクリアすれば、単なる「操作の自動化」を超えた、システムを守る真のエンジニアへの階段を確実に登ることができますよ。それでは、熱いエンジニア魂を込めて解説していきましょう!
—
なぜ「保存前のAUDIT(監査)」が絶対正義なのか?
AutoCADには、図面のエラーを検知して修復する`AUDIT`(監査)という最強のコマンドが備わっています。
通常、これを実行するには、
1. コマンドラインに `AUDIT` と打ち込む
2. 「データベースのエラーを修復しますか?」に対して `Y (Yes)` を選択する
という手動のステップを踏む必要があります。
これを何百枚もの図面に対して手動で行うのは、拷問に近いですよね。だからといって放置すると、図面が重くなったり、最悪の場合はある日突然「Drawing file is not valid(有効な図面ファイルではありません)」という非情なエラーメッセージと共に開けなくなったりします。
「SendCommand」という諸刃の剣
AutoCAD VBAには、AutoCADのコマンドラインに文字列を送り込む `SendCommand` というメソッドがあります。これを使えば、VBAから `AUDIT` を実行できそうですよね。
しかし、ここで実務中級者が必ずハマる「致命的な罠」があります。
`SendCommand` は、人間がキーボードを叩くのと同じ速度で非同期(裏でバラバラと)にコマンドを実行するため、VBAの次のコード行とタイミングがズレてしまい、「図面がまだ保存し切っていないのに次の処理が走る」といったカオスを生み出すのです。
この非同期の壁を乗り越え、データベースを安全に操作するプロの技術を見ていきましょう。
—
実装コード:鉄壁のセーブ&監査自動化マクロ
以下のコードは、現在の図面に対してエラー監査を自動実行し、完全にクリーンな状態にした上で上書き保存を行う実務仕様のプロシージャです。
標準モジュールに貼り付けて、そのまま現場で使えるように設計しています。
Sub SafeAuditAndSave()
On Error GoTo ErrorHandler
Dim doc As AcadDocument
Set doc = ThisDrawing.Application.ActiveDocument
‘ 【重要】開いている図面がまだ一度も保存されていていない(新規図面)場合は除外
If doc.Name = “図面1.dwg” Or InStr(doc.FullName, “:”) = 0 Then
MsgBox “この図面はまだ一度も名前を付けて保存されていません。” & vbCrLf & _
“一度手動で保存してから実行してください。”, vbExclamation, “セーフティガード”
Exit Sub
End If
‘ ステータスバーに進捗を表示(ユーザーへの優しい配慮)
doc.Utility.Prompt “>>> データベースの健康診断(AUDIT)を開始します…” & vbCrLf
‘ 1. AUDITコマンドの実行
‘ “_.AUDIT” の先頭の “_” (アンダースコア) は、言語の違い(日本語版/英語版)による
‘ コマンドエラーを防ぐためのプロの技です。
‘ その後の “Y” は「エラーを修復しますか?」に対する「はい」を意味します。
doc.SendCommand “_.AUDIT _Y ”
‘ 2. 同期ズレを防ぐためのウェイト(AutoCADがコマンド処理を完了するのを少し待たせる)
‘ ※実務ではDoEventsやタイマーを挟むとより堅牢になります
DoEvents
‘ 3. 変更を確実に保存(QSAVE)
doc.SendCommand “_.QSAVE ”
doc.Utility.Prompt “>>> 監査と保存が正常に完了しました。図面は健全な状態です。” & vbCrLf
MsgBox “図面の監査とクリーンアップが無事に完了しました!”, vbInformation, “完了”
Exit Sub
ErrorHandler:
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “エラー発生”
‘ エラー時もAutoCADがフリーズしないようにコマンドを強制キャンセル
On Error Resume Next
ThisDrawing.Application.ActiveDocument.SendCommandchr$(3) & chr$(3)
End Sub
—
コードの深掘り解説:ここがエンジニアのこだわりポイント!
初心者から一歩抜け出すために、上記のコードに散りばめられた「プロの知見」を3つ解説します。
1. コマンド名の頭にある「アンダースコア(`_`)」の秘密
コード内で `_.AUDIT` と記述しています。ただの `AUDIT` ではダメなのでしょうか?
実はこれ、日本語版AutoCADと英語版AutoCADの両方でマクロを正常に動かすための極意です。
アンダースコアをつけることで、AutoCADに対して「グローバルコマンド名(英語基準の本来の名前)で実行せよ」と指示することになり、環境依存のエラーを防ぐことができます。細かいですが、納品するツールなどでは必須のテクニックです。
2. 新規未保存図面へのガード処理
`doc.Name` や `doc.FullName` をチェックしている部分です。
まだ一度も名前をつけて保存されていない図面に対して `AUDIT` や `QSAVE` を強行すると、AutoCADが保存先を聞き出すダイアログを出してしまい、裏で動いているマクロが完全にフリーズしてしまいます。
「事故が起きる条件をあらかじめコードで潰しておく」――これが堅牢なプログラムの鉄則です。
3. キャンセル処理(`chr$(3)`)
エラーハンドラーの最後にある `chr$(3)`。これはキーボードの [Esc] キー を2回叩く動作をVBAからエミュレートしています。
万が一、AUDITの最中に何らかの例外が発生してAutoCADがコマンド待ちの宙ぶらりんな状態になったとき、強制的にコマンドをキャンセルして正常な状態(コマンドプロンプトが「コマンド:」に戻った状態)に復帰させます。
—
さらに高みを目指すあなたへ:Databaseオブジェクト直接操作への誘い
今回は手軽に導入できる `SendCommand` を使いましたが、AutoCAD VBAの真髄は ObjectDBX や AcadDatabaseオブジェクト を直接メモリ上で叩くことにあります。
`SendCommand` は画面(UI)を伴うため動作がやや遅く、画面がパカパカと点滅します。しかし、図面を開かずに(バックグラウンドで)DWGのデータベースオブジェクトだけを読み込み、メモリ上で `Audit` メソッド(※Databaseオブジェクトには直接Auditメソッドが存在します)を走らせて保存し直すことができれば、100枚、1,000枚の図面監査もコーヒーを飲んでいる間に終わらせることができます。
まずは今回の `SafeAuditAndSave` をご自身の業務図面に組み込んで、「保存の安心感」を手に入れてください。
ここをクリアすれば、AutoCAD VBAの基本はバッチリです!
あなたの自動化ライフが、より快適でエラーのないものになりますように。それではまた、次の極限の知見でお会いしましょう!
