【AutoCAD VBA極意】「PurgeAll」という名の劇薬を捨てろ。現場を壊さない「外科手術的」画層クリーンアップの流儀
AutoCADの自動化において、`PurgeAll`メソッドを安易に使うのは「害虫駆除のために家を焼き払う」ようなものだ。
実務レベルのツール開発では、意図しない画層削除やブロック定義の喪失は致命的なトラブルを招く。特に、クライアントや協力会社とのデータ連携環境下では、特定の規約に従い、不要な層だけをピンポイントで排除する「外科手術的なロジック」こそが、一流のエンジニアに求められる要件だ。
本稿では、VBAを用いて安全かつ高速に画層をクリーンアップする、現場の実践的解法を伝授する。
—
1. なぜ「PurgeAll」ではいけないのか?
AutoCADのデータベースは複雑な参照関係(依存関係)で構築されている。`PurgeAll`は、その名の通り「削除可能なものすべて」を根こそぎ消し去る。しかし、実務では以下のようなリスクが伴う。
- テンプレート依存の喪失: 会社標準の線種やスタイルが、図面上未使用という理由だけで消える。
- レイアウト管理の崩壊: ビューポートでしか使っていない画層が「不要」と判定され、出力時に表示が消える。
- 不可逆な操作: 実行後の「元に戻す(Undo)」操作がメモリを圧迫し、大規模図面ではクラッシュの原因となる。
我々が目指すべきは、「削除対象の条件をコードレベルで制御し、トランザクションの負荷を最小化する」ことだ。
—
2. 実践コード:特定の不要画層を排除するクリーンアップ・エンジン
以下のコードは、指定した名前の画層、あるいは「空(オブジェクトゼロ)」の画層を安全に削除するためのプロダクション・テンプレートだ。
‘ 【AutoCAD VBA】ピンポイント画層削除ユーティリティ
Public Sub PurgeSpecificLayers()
Dim acadDoc As AcadDocument
Dim layerObj As AcadLayer
Dim layerCol As AcadLayers
Set acadDoc = ThisDrawing
Set layerCol = acadDoc.Layers
‘ 削除対象の接頭辞や特定の名前を定義
Const TARGET_PREFIX As String = “TEMP_”
‘ エラー回避のためのカウンタ
Dim deletedCount As Integer: deletedCount = 0
‘ AutoCADのデータベースループを最適化するため、逆順走査は行わず
‘ コレクションを安定して操作する
On Error Resume Next ‘ 削除不可画層に対するエラーをハンドリング
For Each layerObj In layerCol
‘ 1. 基本条件:現在の画層や「0」画層は絶対に削除しない
If layerObj.Name <> “0” And layerObj.Name <> acadDoc.ActiveLayer.Name Then
‘ 2. 「未使用かつ特定の接頭辞を持つ」場合のみ削除
‘ 厳密にはDeleteメソッドを実行し、成功した場合のみカウント
If Left(layerObj.Name, Len(TARGET_PREFIX)) = TARGET_PREFIX Then
layerObj.Delete
If Err.Number = 0 Then
deletedCount = deletedCount + 1
Else
Err.Clear
End If
End If
End If
Next layerObj
On Error GoTo 0
MsgBox “クリーンアップ完了: ” & deletedCount & ” 個の画層を削除しました。”, vbInformation
End Sub
—
3. このロジックを「堅牢」にするための3つの鉄則
① 削除チェックの多重化
単に`Delete`メソッドを叩くのではなく、`layerObj.Count`(エンティティ数)が0であることを確認するロジックを入れれば、さらに安全性は高まる。ただし、AutoCADの`AcadLayer.Count`は直接取得できないため、`Filter`機能を使って選択セットを作成し、カウントするという手法を併用するのがベストプラクティスだ。
② エラーハンドリングの「沈黙」を許すな
上記のコードでは`On Error Resume Next`を使用している。これは、AutoCADが「削除できない画層(XRef参照中や現在画層)」を削除しようとした際に、プログラムが停止するのを防ぐためだ。実運用では、削除失敗した画層名をログファイル(CSV等)に出力する仕組みを組み込むと、後方互換性やデバッグが劇的に楽になる。
③ データベース連携時のトランザクション意識
もしこのスクリプトを外部データベース(SQL Server等)と連携させる場合、`Purge`処理の直前に`acadDoc.Save`を強制すべきではない。削除に失敗した場合、データベース側の情報と図面側のレイヤー名に不整合が生じる。
「図面更新→成功→DB同期」という順序を徹底すること。
—
4. 最後に:エンジニアとしての矜持
AutoCAD VBAは、現代ではレガシーな技術と見なされがちだ。しかし、APIを深く理解し、メモリやオブジェクトのライフサイクルを制御できるエンジニアにとって、それは「最強のハッキングツール」にもなり得る。
「とりあえず動けばいい」というコードは、数ヶ月後の自分やチームを苦しめることになる。今回提示したような「外科手術的アプローチ」を身につけ、図面の健全性を守ることは、単なる自動化以上の価値——つまり「信頼」を築くことなのだ。
次のステップとして、このコードをベースに「レイヤーの命名規則を自動チェックし、違反画層を自動移動・削除する」という高度なバリデーションツールへの発展を推奨する。
現場の生産性を極限まで高めるのは、いつだって「丁寧な設計」だ。健闘を祈る。
