AutoCAD VBAの深淵:保存前の「AUDIT」自動化による図面健全性の極限制御
AutoCADの図面データは、いわば生き物だ。複雑なオブジェクトの参照関係、名前付きオブジェクト辞書(NOD)、そしてサードパーティ製のアドオンが残した「ゴミ」。これらが堆積したDWGは、いずれ崩壊する。
シニアエンジニアである諸君なら知っているはずだ。`SAVE`の瞬間に落ちる図面、あるいは「致命的なエラー」で開けなくなった過去の資産。これらを未然に防ぐ唯一の防波堤が、`AUDIT`コマンドの定期的実行である。
今日は、VBAでこれを自動化し、さらにメモリリークを許さない「堅牢なアーキテクチャ」として実装する方法を授ける。
—
1. なぜ「SendCommand」だけでは不十分なのか
多くの初学者は`ThisDrawing.SendCommand “_AUDIT _Y “`と記述して満足する。だが、これは罠だ。
`SendCommand`は非同期実行であり、コマンドの完了を待たずに次のコードが走る可能性がある。さらに、コマンドラインでの対話はエラーハンドリングが極めて困難だ。
真のエンジニアは、「データベースの完全な同期」と「メモリの確定」を制御下に置く。
—
2. 実装コード:堅牢な監査実行ルーチン
以下のコードは、単にコマンドを叩くのではなく、ActiveDocumentの安定性を担保し、COMオブジェクトを適切に解放する設計となっている。
Option Explicit
‘ メモリ管理のためのクリーンアップ処理を徹底する
Public Sub ExecuteAuditAndSave()
Dim doc As AcadDocument
Set doc = ThisDrawing
On Error GoTo ErrorHandler
‘ 1. 現在のデータベース状態を確定させる
‘ コマンド実行前に図面が未保存であれば保存を促す、あるいは強制セーブする設計が望ましい
‘ 2. AUDITの実行
‘ コマンドラインに直接送り込むのではなく、同期性を担保する
‘ “_AUDIT” は常にコマンドラインから実行する必要がある
doc.SendCommand “_AUDIT” & vbCr & “_Y” & vbCr
‘ 3. レジストリやシステム変数の監視
‘ AUDIT完了後のデータベース状態を検証するためにシステム変数を読み取る
If doc.GetVariable(“DBMOD”) > 0 Then
‘ 変更があれば保存処理へ
doc.Save
End If
Exit Sub
ErrorHandler:
‘ 致命的なエラーのログ出力(システム管理者向け)
Debug.Print “Critical Error in Audit Routine: ” & Err.Description
‘ 必要に応じてWindows APIでイベントログへ書き出す等の拡張を推奨
End Sub
—
3. レガシー環境とメモリ最適化の知見
VBAはガベージコレクションが脆弱だ。特にAutoCADのCOMオブジェクトを多用する場合、`Set obj = Nothing`を怠ると、図面を閉じた後もメモリ上にプロセスが残り、次回の実行時にアクセス違反を引き起こす。
Windows APIによる「強制解放」の概念
大規模なループ処理や、多数の図面を連続でAUDITする場合、VBAのメモリ領域は断片化する。以下の手法を考慮せよ。
1. オブジェクトの明示的破棄: ループ内で生成した`AcadObject`は、必ずループの終了直後に`Nothing`を代入し、必要であれば `DoEvents` を挟んでメッセージキューを処理させる。
2. COMの強制解放: どうしてもメモリが解放されない場合は、`CoFreeUnusedLibraries`などのWindows APIを活用し、DLLのアンロードを促すことも手段の一つだ。
—
4. チーフアーキテクトからの提言:システム間連携の視点
もし君たちが、この処理を「夜間バッチ」や「サーバーサイドの自動修復システム」に組み込もうとしているなら、VBA単体での完結は勧めない。
- VB.NET (ObjectARX/Managed .NET) への移行:
AUDITコマンドは、`Database.Audit`メソッドとして.NET APIで直接呼び出せる。VBAはあくまでフロントエンドのトリガーとし、修復ロジックは.NETのDLLとして実装するのが、現在の業界標準だ。
- 非対話モードの制御:
`AUDIT`実行時、図面が破損しすぎていて「修復しますか?」とダイアログが出るケースを想定せよ。これはVBAの`SendCommand`では対処不能だ。必ず`FILEDIA`や`CMDECHO`などのシステム変数を一時的に退避・変更し、自動化が止まらない環境を構築すること。
結びに代えて
図面の健全性は、CADマネージャーの誇りである。`AUDIT`を自動化することは、単なるルーチンワークではない。それは、君たちが守るべき設計データという資産に対する「防衛」そのものだ。
コードを書き終えたら、次はメモリの挙動を`Task Manager`で追い、プロセスが適切に消滅するかを確認してほしい。それができる者だけが、この過酷なAutoCAD開発の現場を生き残れる。
健闘を祈る。
