【入門編】【上級プロフェッショナル】図面内のオブジェクトを、指定した条件(画層、色、線種、ブロック名など)で自動削除する安全な方法 – AutoCAD VBA解析バイブル

スポンサーリンク

AutoCAD VBAを掌握せよ:不要オブジェクトを「狙い撃ち」で安全に一掃する極意

こんにちは。AutoCADの自動化の世界へようこそ。
「マクロの記録」ボタンを押すだけの日々は、今日で卒業しましょう。

AutoCAD VBAにおいて、最も恐ろしいのは「誤削除」です。一度 `Delete` メソッドを叩けば、`Undo`(元に戻す)コマンドでさえ、VBAの制御下では時に不安定になります。今日は、伝説的なアーキテクトが現場で使う「安全かつ高速なオブジェクト削除術」を伝授します。

1. なぜ「単純なループ」で削除してはいけないのか?

初学者が真っ先にぶつかる壁。それは「ループ中にオブジェクトを削除すると、インデックスがずれてエラー(または無限ループ)が発生する」という現象です。

例を見てみましょう。

  • 10個の円があったとして、1番目を削除すると、2番目だった円が自動的に1番目に繰り上がります。しかし、プログラムは「次は2番目を見る」と動いているため、削除をスキップしてしまうのです。

この問題を解決するには、「後ろから回す(逆ループ)」という鉄則を守る必要があります。

2. 現場で使える「条件付き自動削除」エンジン

今回は、特定の画層・色・ブロック名などを判定し、安全に削除するためのテンプレートコードを用意しました。この構造を理解すれば、どんな複雑な条件も追加できます。

Option Explicit

‘ — 指定条件でオブジェクトを削除するメインプロシージャ —
Public Sub DeleteObjectsByCondition()
Dim obj As AcadEntity
Dim doc As AcadDocument
Dim i As Long

Set doc = ThisDrawing

‘ 逆ループで回す(後ろから削除すればインデックスのズレを防げる)
For i = doc.ModelSpace.Count – 1 To 0 Step -1
Set obj = doc.ModelSpace.Item(i)

‘ 【削除条件の判定】
‘ ここでは「画層が”TEST_LAYER”かつ色が赤(1)」を対象にする例
If obj.Layer = “TEST_LAYER” And obj.Color = acRed Then

‘ 念のための確認(運用に合わせてコメントアウト可)
‘ Debug.Print “削除対象を発見: ” & obj.ObjectName

‘ 削除の実行
obj.Delete
End If
Next i

‘ データベースの更新を確定
doc.Regen acActiveViewport
MsgBox “クリーンアップが完了しました。”
End Sub

このコードのポイント

  • `For i = Count – 1 To 0 Step -1`: これが「逆ループ」の呪文です。プロフェッショナルは常にこれを使います。
  • `Set obj = …`: オブジェクトを一度変数に格納することで、判定の柔軟性が劇的に向上します。
  • `acActiveViewport`: 削除後は必ず `Regen` を行い、図面データベースと描画状態を同期させましょう。

3. なぜ「オブジェクトモデル」を意識すべきなのか?

AutoCAD VBAを操る上で、「モデル空間(ModelSpace)」「ペーパー空間(PaperSpace)」の区別は避けて通れません。

上記のコードはモデル空間を対象としていますが、もし図面全体(ペーパー空間含む)を対象にしたい場合は、`ThisDrawing.Layouts` を走査するロジックに拡張する必要があります。

陥りやすいエラー:型変換の罠

特にブロック参照(`AcadBlockReference`)を扱う場合、`obj.ObjectName` を見てブロック名を判定するテクニックが有効です。

‘ ブロック名が “TEMP_BLOCK” なら削除する判定例
If TypeOf obj Is AcadBlockReference Then
If obj.Name = “TEMP_BLOCK” Then
obj.Delete
End If
End If

このように `TypeOf` を使って「今、手元にあるオブジェクトが何者か」を確認する癖をつけると、プログラムの堅牢性が飛躍的に向上します。

4. チーフアーキテクトからのアドバイス

AutoCAD自動化において、コードの「速さ」以上に大切なのは「検証(Verify)」です。

1. まずはSelection Set(選択セット)でテストする: いきなり削除するのではなく、まずは対象オブジェクトをハイライト(`obj.Highlight True`)させて、意図通りか確認するデバッグ工程を挟んでください。
2. Undoグループの活用: `ThisDrawing.StartUndoMark` と `EndUndoMark` を使えば、VBAの処理をひとまとめにして、一度の `Undo` で元の状態に戻せるようになります。

まとめ

  • 削除は必ず「後ろから(逆ループ)」行うこと。
  • `TypeOf` を駆使して、確実にオブジェクトを特定すること。
  • いきなり消さず、まずはハイライトで確認する余裕を持つこと。

この3つをクリアすれば、あなたはもう「マクロ記録」の枠を超えた、真のエンジニアです。AutoCADは、あなたの書いたコードに従順な、非常に強力なパートナーになります。

次は、これを応用して「特定の画層にある線分だけを長さ順に並べる」といった発展的なタスクに挑戦してみてください。応援しています。

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