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は、あなたの書いたコードに従順な、非常に強力なパートナーになります。
次は、これを応用して「特定の画層にある線分だけを長さ順に並べる」といった発展的なタスクに挑戦してみてください。応援しています。
