AutoCAD VBAの「選択セットエラー」を1行で葬る。伝説のエンジニアが教える「安全な初期化」の極意
AutoCADの自動化へようこそ。
マクロの記録から一歩踏み出し、自力でコードを書こうとしたとき、誰もが最初にぶつかる「壁」があります。
それが、「実行時エラー: 選択セットは既に存在します」という悪名高いメッセージです。
「さっき実行したときには動いたのに、もう一度動かしたらエラーになった…」
そんな経験、ありませんか?
今日は、このエラーを根本から解決し、どんな状況でも安定して動作する「プロ仕様の初期化テンプレート」を伝授します。これさえ理解すれば、あなたはもう初心者ではありません。
—
なぜ「選択セット」はエラーを吐くのか?
AutoCADのVBAにおいて、`SelectionSets`(選択セット)は、図面上のオブジェクトを一時的に束ねる「箱」のようなものです。
この箱には名前をつけるのですが、AutoCADは「同じ名前の箱が残っていると、新しい箱を作らせてくれない」という性格を持っています。プログラムを終了しても、一度作った「箱」はメモリ上に居座り続けてしまうのです。
これが、2回目にエラーが出る正体です。
—
1行で解決する「伝説の初期化関数」
この問題を回避する唯一にして最強の方法は、「もし同じ名前の箱があったら、作り直す前に削除する」という処理を自動化することです。
以下の関数を標準モジュールにコピペしてください。これだけで、あなたのコードは劇的に堅牢になります。
‘ —————————————————————————
‘ 関数名: GetOrCreateSelectionSet
‘ 概要: 指定した名前の選択セットを取得。存在すれば削除してから新規作成する
‘ —————————————————————————
Public Function GetOrCreateSelectionSet(setName As String) As AcadSelectionSet
Dim ss As AcadSelectionSet
‘ 既に同名の選択セットが存在するか確認し、あれば削除する
On Error Resume Next ‘ エラーを無視して続行(削除エラーを防ぐため)
ThisDrawing.SelectionSets.Item(setName).Delete
On Error GoTo 0 ‘ エラー制御を通常に戻す
‘ 新しく空の選択セットを作成して返す
Set GetOrCreateSelectionSet = ThisDrawing.SelectionSets.Add(setName)
End Function
—
なぜ、これで解決するのか?(コードの解説)
このコードには、現場で生き残るための「2つの鉄則」が隠されています。
1. `On Error Resume Next` の正しい使い方
VBAで「エラーが出たら無視する」という手法は乱用禁止ですが、ここには明確な理由があります。`Delete` メソッドは「存在しない名前」を指定するとエラーを返します。つまり、「まだ存在しない」というエラーを、あえて無視することで、次の行へスムーズに進ませているのです。
2. `ThisDrawing.SelectionSets` の管理
`ThisDrawing` は、現在開いている図面オブジェクトを指します。その中の `SelectionSets` コレクションを直接操作することで、図面とあなたのプログラムの「同期」を確実に行っています。
—
実践:あなたのコードへの組み込み方
使い方は簡単です。これまで `SelectionSets.Add` と書いていた場所を、この関数に置き換えるだけです。
Sub MyAutoCADMacro()
Dim mySS As AcadSelectionSet
‘ 「MyLayerSelect」という名前で安全にセットを作成
Set mySS = GetOrCreateSelectionSet(“MyLayerSelect”)
‘ あとは自由に選択処理を行う
mySS.SelectOnScreen
‘ 処理が終わったらクリア(次の実行のために)
mySS.Delete
End Sub
—
先輩エンジニアからのアドバイス
AutoCAD VBAをマスターするコツは、「オブジェクトのライフサイクル(寿命)を意識すること」です。
今回紹介した「作成前に削除する」という処理は、いわば「毎朝デスクを掃除してから仕事に取り掛かる」ようなものです。これを習慣にするだけで、あなたの書くプログラムの安定性は、初心者のレベルを遥かに超越します。
エラーが出ないコードを書くことは、あなたの時間を守ることに直結します。ぜひ、今日からこのテンプレートをあなたの「武器」として活用してください。
何か不明な点があれば、いつでも聞いてくださいね。あなたのエンジニアとしての成長を、心から応援しています!
