【テクニカル・上級編】【初心者向け】AcadDocument.SelectionSetsの「名前重複エラー」を1行で解決する、安全な初期化テンプレート – AutoCAD VBA解析バイブル

スポンサーリンク

AutoCAD VBAの呪縛を解く:SelectionSetsの「名前重複エラー」を物理的に消滅させる極意

AutoCADのVBA開発において、避けては通れない「実行時エラー: 選択セットは既に存在します」。
このエラーに直面するたび、あなたは`On Error Resume Next`という逃げ道を選んでいないだろうか?

断言する。それはアーキテクチャの敗北だ。

業務自動化エンジニアとして、多くのレガシーシステムを解析してきたが、このエラーを甘く見た結果、メモリリークの温床となり、AutoCADそのものを不安定にさせている例を数え切れないほど見てきた。今日は、この「名前重複問題」を根本から解決し、堅牢なシステムを構築するための極限のテンプレートを授ける。

—

なぜ SelectionSets は我々を苦しめるのか

AutoCADの`SelectionSets`は、AutoCADのセッションが終了するまでメモリ上に保持される。つまり、一度作成した名前(Key)は、スクリプトが終了しても、あるいはエラーで中断しても、`AcadDocument`内に亡霊として残り続けるのだ。

`On Error Resume Next`で隠蔽するのは、ゴミ屋敷の掃除を「見なかったことにする」のと同じである。正解は、「使用する前に必ず存在を確認し、存在すれば即座に抹消(Delete)する」という、極めて事務的かつ冷徹なライフサイクル管理である。

—

1行で解決する:堅牢な初期化関数

以下の関数は、私が長年、大規模な図面処理システムで標準採用しているものだ。この関数をモジュールの先頭に忍ばせておくだけで、貴方のコードから「選択セットエラー」は永遠に追放される。

‘ ————————————————————————-
‘ @brief 選択セットを安全に取得・作成するユーティリティ
‘ @param ssName 取得したい選択セット名
‘ @return 初期化済みのAcadSelectionSetオブジェクト
‘ ————————————————————————-
Public Function GetSafeSelectionSet(ByVal ssName As String) As AcadSelectionSet
Dim doc As AcadDocument: Set doc = ThisDrawing

‘ 1. 既存のセットを確認し、存在すれば削除(これが物理的解決)
On Error Resume Next
doc.SelectionSets.Item(ssName).Delete
On Error GoTo 0

‘ 2. 新規セットを作成して返す
Set GetSafeSelectionSet = doc.SelectionSets.Add(ssName)
End Function

このコードが「伝説」である理由

1. 生存期間(ライフサイクル)の完全制御:
`Delete`メソッドを呼ぶことで、AutoCAD内部のシンボルテーブルから該当エントリを完全に消去する。これにより、メモリのフラグメンテーションを防ぐ。
2. 型安全性と明示的な解放:
`On Error Resume Next`のスコープを最小限に絞り、エラーが発生する「可能性」がある場所のみを局所化している。
3. 再利用性:
この関数を通すことで、呼び出し元は「常にクリーンな状態の選択セット」を手にすることができる。

—

シニアエンジニアへの追伸:メモリとAPIの深淵

このコードを導入するだけで、君のAutoCAD VBAコードは劇的に安定するだろう。しかし、さらにその先を目指すのであれば、以下の点に留意してほしい。

  • オブジェクトの明示的解放:

VBAのガベージコレクションを信じてはいけない。作業が終わった選択セットは、必ず`Set ss = Nothing`で参照を解放し、可能であればループ処理の最後で再度`ss.Delete`を行うのが、真のプロフェッショナルだ。

  • Windows APIとの協調:

AutoCADの操作を外部から制御(外部実行ファイル等)する場合、`SelectionSets`の削除を怠ると、AutoCADのCOMサーバーがゾンビ化し、バックグラウンドでプロセスが残り続ける原因となる。これはシステム全体のパフォーマンスを決定的に劣化させる。

  • 大規模図面での注意:

数万の図形を一気に選択する処理を行う場合、選択セットの作成順序や、`SelectionSets`へのアクセス頻度を調整することで、AutoCADのレンダリングパフォーマンスに直結するオーバーヘッドを削ぎ落とせる。

最後に

「動けばいい」というコードは、1ヶ月後の君自身を裏切る。
今回紹介した手法は、単なるエラー回避ではない。AutoCADという巨大で複雑なCOMオブジェクトを、貴方の掌の上で完全に制御するための「規律」である。

このテンプレートを基盤に、より安定した、そして何より美しいコードを書き上げてほしい。健闘を祈る。

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