【AutoCAD VBA極意】納品データの「重さ」をゼロにする――未使用オブジェクトの一括パージとクリーン保存の自動化
こんにちは。今日も図面作成の現場で、効率化の旗を振って戦っている皆さんの姿が目に浮かびます。
「マクロの記録」を使って、なんとか自動化の第一歩を踏み出した。素晴らしい一歩です。でも、もしあなたが今、「記録したマクロが思い通りに動かない」「図面がなぜか重いままなんだ」という壁にぶつかっているとしたら……それはあなたが「AutoCADの真の姿」に近づいている証拠です。
今日、皆さんに伝授するのは、単なるコードの書き方ではありません。AutoCADという巨大な「データベース」をいかにコントロールし、クライアントに「なんて綺麗なデータなんだ!」と驚かれるような、軽量で完璧な図面を自動で作り上げるか。そのための「クリーンアップ・ロジック」の極意です。
1. なぜ「消したはず」なのに図面は重いのか?
まず、エンジニアとしての視点を持っておきましょう。
AutoCADの図面ファイル(DWG)は、単なる「線の集まり」ではありません。実は、非常に高度に構造化された「データベース」なのです。
例えば、あなたが「レイヤーA」を作成し、そこに線を一本引いたとします。その後、その線を削除したとしましょう。
ここが落とし穴です。
線(グラフィカルオブジェクト)は消えましたが、「レイヤーA」という定義(非グラフィカルオブジェクト)は、データベースの中に居座り続けています。これが積み重なると、目には見えない「幽霊」のようにファイルサイズを肥大化させ、動作を重くする原因となります。
これを一掃するコマンドが、皆さんもよく知る `PURGE`(パージ)です。
しかし、VBAでこれを制御するには、単にコマンドを呼び出すだけでは不十分なのです。
2. 実装の戦略:SendCommandを使いこなす
AutoCAD VBAにおいて、`PURGE` コマンドを完全に制御するには、`SendCommand` メソッドを利用するのが最も確実で、かつ実務的なアプローチです。
「えっ、API(オブジェクトモデル)を使わずにコマンドを送るんですか?」と思ったあなた。鋭いですね。
実は、パージのような「図面全体をスキャンして、依存関係を解決しながら削除する」という複雑な処理は、AutoCADの内部エンジン(コマンドライン)に任せたほうが、エラーが少なく、かつ高速なのです。
私たちの仕事は、「人間がコマンドラインに打ち込む手順を、完璧なシーケンスでプログラムに代行させること」にあります。
3. 【実践】クリーン保存マクロの完全コード
それでは、実際に現場でそのまま使える、プロ仕様のコードを見ていきましょう。
このコードは、「パージを実行」→「すべてを選択」→「確認ダイアログをすべてスキップ」→「保存」という一連の流れを、一瞬で完結させます。
Option Explicit
''' <summary>
''' 図面内の未使用オブジェクトを完全にパージし、クリーンな状態で保存する
''' </summary>
Public Sub CleanSaveWorkflow()
Dim acadDoc As AcadDocument
Set acadDoc = ThisDrawing
On Error GoTo ErrorHandler
' 1. ユーザーへの確認(誤操作防止のため、実務では重要です)
Dim response As VbMsgBoxResult
response = MsgBox("未使用のレイヤーや線種をパージし、上書き保存を実行しますか?", _
vbQuestion + vbYesNo, "クリーンアップ実行")
If response = vbNo Then Exit Sub
' 2. パージ処理の実行
' SendCommandの引数は、コマンドラインに打ち込む文字列です。
' "-PURGE" : ハイフンを付けることで、ダイアログではなくコマンドライン版を呼び出します。
' "A" : "All"(すべて)を指定
' "" : 名前を指定しない(すべて)
' "N" : 各オブジェクトの削除確認に対して "No"(確認しない)
' vbCr : Enterキー(改行)を意味します。
Debug.Print "Purgeを開始します..."
' ここが魔法のシーケンスです。
' パージを「すべて」「名前指定なし」「確認なし」で実行する一連の入力。
' ※AutoCADのバージョンによって、最後のEnterの回数が異なる場合があります。
acadDoc.SendCommand "-PURGE" & vbCr & "A" & vbCr & vbCr & "N" & vbCr
' 3. 完了を待つための僅かな猶予(SendCommandは非同期的に動くことがあるため)
' ※極めて複雑な図面の場合、ここで少し待ちを入れるのがプロの技です。
DoEvents
' 4. 保存の実行
Debug.Print "保存を実行します..."
acadDoc.Save
MsgBox "クリーンアップと保存が完了しました!", vbInformation, "成功"
Exit Sub
ErrorHandler:
MsgBox "エラーが発生しました: " & Err.Description, vbCritical, "実行エラー"
End Sub
4. 陥りやすい「3つの罠」と回避術
このコードを動かす際、あるいは自分でカスタマイズする際に、初心者が必ずと言っていいほど踏む罠があります。これを回避できれば、あなたはもう初級者ではありません。
① 「ハイフン(-)」の重要性
`PURGE` とだけ書くと、AutoCADは「あの使い慣れたダイアログボックス」を出そうとします。しかし、VBAの `SendCommand` は、ユーザーの操作を待つダイアログが出ると、そこで処理が止まってしまう(あるいはエラーになる)ことがあります。
必ず `-PURGE` と、頭にハイフンを付けてください。これにより「コマンドライン版」が起動し、プログラムから制御可能になります。
② Enterキー(vbCr)の数
`SendCommand` で送る `vbCr` は、人間が「Enterキー」を叩く動作です。
パージコマンドは、「すべて実行しますか?」「名前は何にしますか?」「削除していいですか?」と、何度も質問してきます。この質問の数と同じ数だけ `vbCr` を送る必要があります。
もしマクロが途中で止まったら、それは「Enterキーの回数が足りなくて、AutoCADが質問の返答を待っている状態」です。
③ 非同期処理の壁
`SendCommand` は、命令を「投げっぱなし」にする性質があります。命令を送った直後に `Save` を実行しようとすると、パージが終わる前に保存が始まってしまい、結局ゴミが残ることがあります。
コード内の `DoEvents` や、必要に応じて `Sleep`(Windows API)を挟むことで、処理の同期を図るのがプロのディテールです。
5. 最後に:自動化の先にあるもの
ここまで読んでくれたあなたなら、もう気づいているはずです。
私たちが目指しているのは、単に「コマンドを自動化すること」ではありません。
「人間が本来集中すべき、設計や創造の時間を、単純作業から解放すること」
です。
図面をクリーンに保つことは、データの整合性を守り、プロジェクト全体の品質を高めることにつながります。今回学んだ「パージの制御」は、そのための強力な武器になります。
もし、このコードがうまく動かなかったり、もっと複雑な条件(特定のレイヤーだけは残したい、など)が必要になったりしたら、いつでも戻ってきてください。道は続いています。
さあ、コードを書き換えて、あなたのAutoCADに「魂」を吹き込みましょう。応援していますよ。
