【入門編】【実務中級者向け】図面保存時の「未参照レイヤー・線種」の自動一括削除:クリーンな納品データ作成の自動化 – AutoCAD VBA解析バイブル

スポンサーリンク
スポンサーリンク

【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に「魂」を吹き込みましょう。応援していますよ。

タイトルとURLをコピーしました