【AutoCAD VBAの極意】「保存」をトリガーに図面を浄化せよ!BeginSaveイベントによる自動化の深淵
こんにちは。AutoCADの自動化という荒野を旅するエンジニアの皆さん。
これまで「マクロの記録」で生成されたコードを眺めて満足していたなら、今日でその卒業証書を受け取ってください。
現場で最も恐ろしいのは「ゴミデータで肥大化した図面」です。レイヤーの残骸、使われないブロック……これらが保存のたびに積み重なれば、図面はいつか破綻します。
今回は、ユーザーが「保存」ボタンを押した瞬間、AutoCAD自身が自浄作用を発揮して図面をクリーンアップする「BeginSaveイベント」のフックについて解説します。これさえマスターすれば、君の図面は常に最高品質で保たれます。
—
1. 「イベント」とは何か?——能動から受動への転換
通常のVBAマクロは「ボタンを押して実行する」という能動的な動作です。しかし、プロの自動化は「AutoCADの状態変化を監視する(イベント)」ことに重きを置きます。
今回扱う`BeginSave`は、「保存処理が開始される直前」に割り込むイベントです。ユーザーがうっかりクリーンアップを忘れても、VBAが背後で必ず仕事をする。これこそが自動化の真髄です。
—
2. 準備:クラスモジュールという「箱」を作る
VBAでイベントを扱うには、標準モジュールではなく「クラスモジュール」を使います。これがイベントを待ち受ける「番人」となります。
1. VBAエディタで「挿入」→「クラスモジュール」を選択。
2. 名前を `ClassEvent` に変更します。
3. 以下のコードを記述してください。
‘ — クラスモジュール: ClassEvent —
Public WithEvents AcadApp As AcadApplication
‘ 保存が始まる瞬間に呼び出されるイベント
Private Sub AcadApp_BeginSave(ByVal FileName As String)
On Error Resume Next ‘ エラーで保存を止めてしまわないための防波堤
‘ 図面の浄化処理を実行
Call CleanDrawing
MsgBox “保存前に図面を最適化しました!”, vbInformation, “AutoCAD自動化”
End Sub
Private Sub CleanDrawing()
Dim doc As AcadDocument
Set doc = ThisDrawing
‘ 1. 監査(Audit)を実行:図面の整合性を修復
doc.SendCommand “_AUDIT” & vbCr & “Y” & vbCr
‘ 2. パージ(Purge):不要なオブジェクトを完全抹殺
‘ ※パージは複数回繰り返さないとネストされたオブジェクトが消えない特性があります
Dim i As Integer
For i = 1 To 3
doc.SendCommand “_PURGE” & vbCr & “A” & vbCr & “” & vbCr & “N” & vbCr
Next i
doc.Regen acActiveViewport
End Sub
—
3. イベントを「起動」させるための仕掛け
クラスモジュールを作っただけでは、AutoCADはイベントを検知しません。最後に、プログラムの起動時に「番人」をセットアップする必要があります。
標準モジュール(`Module1`等)に以下を書き込みます。
‘ — 標準モジュール —
Public myEventHandler As ClassEvent
Public Sub InitializeEvents()
‘ イベントハンドラを実体化し、AutoCADアプリに紐付ける
Set myEventHandler = New ClassEvent
Set myEventHandler.AcadApp = ThisDrawing.Application
MsgBox “保存自動化システムが稼働しました。”
End Sub
—
4. ここがプロの分かれ道:陥りやすい罠
このコードを実装する際、多くの初心者がハマるポイントを伝授します。
- SendCommandの癖を知る: `SendCommand`は「コマンドラインに文字を入力する」動作をシミュレートします。そのため、コマンド実行中に別の処理を割り込ませるとクラッシュの原因になります。`On Error Resume Next`で処理を堅牢にするのが鉄則です。
- パージは「しつこく」: `_PURGE`コマンドは一度だけでは、ブロックの中に含まれる画層などは消しきれません。上記のコードのようにループで3回程度繰り返すのが、現場で生き残るための知恵です。
- 再帰呼び出しの恐怖: もし`BeginSave`の中で`ThisDrawing.Save`を呼んでしまうと、保存→開始→保存……という無限ループに陥ります。あくまで「現在の保存処理に便乗して整理する」ことに徹してください。
—
まとめ:君の図面は今日から変わる
このコードを「AutoCAD起動時」に自動実行するように設定すれば、君はもう図面のクリーンアップを意識する必要すらありません。
プロのエンジニアとは、「人間がミスをする余地をシステムで潰す」者のこと。
「保存」という当たり前の行為の中に、自動化の美学を組み込んでみてください。
もし実装中に「ここが動かない」「もっとこうしたい」という壁にぶつかったら、それは成長の証です。いつでもまた聞きに来てください。君の自動化ライフが、より効率的で知的であるように祈っています。
それでは、良いコードを!
