【SolidWorks VBA極限解説】SelectByID2の裏切りを断つ!生還率100%のフォールバック設計
開発プロジェクトの現場で、こんな悪夢を見たことはないだろうか。
「数千点のアセンブリから特定部品のコンフィギュレーションを自動制御するマクロを組んだ。テスト環境では完璧だった。しかし、いざ現場のエンジニアに渡して実務データで回したところ、『ランタイムエラー:オブジェクト変数またはWithブロック変数が見つかりません』で突然マクロが沈黙した……」
原因をデバッグすると、犯人は決まって `ModelDoc2.Extension.SelectByID2` メソッドだ。
初心者はこのメソッドを「画面をクリックする魔法の命令」と勘違いしがちだが、APIの深淵を知るアーキテクトから言わせれば、これは「条件が揃わなければ平気で失敗を返す気まぐれなスナイパー」に等しい。戻り値の評価を怠り、選択失敗をそのまま放置するコードは、実務の現場においては「時限爆弾」でしかないのだ。
今回は、SolidWorks VBAにおいて最も遭遇率の高いこの罠を完全にハックし、過酷な実務データでも絶対にクラッシュしない「堅牢(ロバスト)なフォールバック設計」の極意を伝授する。
—
なぜ `SelectByID2` はあなたを裏切るのか?
`SelectByID2` は、指定した名前、タイプ、座標をもとにフィーチャや面、エッジをモデル空間から探し出し、選択状態にする。非常に強力なメソッドだが、以下の「物理的・論理的制約」により、いとも簡単に失敗(`False` を返却)する。
1. フィーチャーツリーの非表示・圧縮(Suppressed)
対象のフィーチャが圧縮されていたり、上位のアセンブリでコンテキストが異なったりする場合、メモリ上に存在しても画面選択のコンテキストから外れる。
2. 名前の衝突と多言語対応(LOCALEの罠)
「Boss-Extrude1」といった英語名でコードを書いても、日本語環境のSolidWorksでは「押し出し1」として内部処理されているケースや、ユーザーが名前を変更しているケースがある。
3. ビューの描画遅延(グラフィック・キャッシュの不整合)
大容量アセンブリや図面を開いた直後、APIが描画完了を待たずに選択を走らせると、APIは対象を見つけられずに空振りする。
ここで、多くの初心者が犯す「最悪のアンチパターン」を見てみよう。
⚠️ 【非効率なアンチパターンの例】
‘ ❌ やってはいけない実装:戻り値を完全無視
Sub BadExample()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
‘ 選択が失敗しようが知ったことか!と次に進む
swModel.Extension.SelectByID2 “Cut-Extrude1”, “FEATURE”, 0, 0, 0, False, 0, Nothing, 0
‘ ここで必ず落ちる(選択されていないため、操作対象がNothingになる)
swModel.FeatureManager.EditCut
End Sub
このコードは、現場の業務自動化において「百害あって一利なし」である。選択できなければ、次の操作(編集や削除)は必ず死ぬ。
—
堅牢なプログラミング:戻り値の厳格な評価とフォールバック
プロフェッショナルなマクロには、「失敗を前提としたリトライ機構」または「代替手段(フォールバック)」が必ず組み込まれている。
`SelectByID2` は成功時に `True`、失敗時に `False` を返す。この戻り値を条件分岐で捕捉し、もし選択に失敗した場合は、段階的に別の検索アプローチに切り替えるか、処理を安全に中断・スキップするロジックを構築しなければならない。
実務で使えるフォールバック戦略の設計思想
1. 第1段階(ダイレクト・セレクション): 通常の `SelectByID2` による高速な名前指定選択。
2. 第2段階(スキャン・フォールバック): 名前での選択が外れた場合、Featureオブジェクトの走査(`GetFirstFeature` / `GetNextFeature`)による総当たり検索に切り替える。
3. 第3段階(ユーザーへの安全な通知): どうしても見つからない場合、ランタイムエラーで強制終了させるのではなく、ログを残して静かに処理を抜ける(あるいは手動選択を促す)。
—
【プロダクションコード】コピペで使える安全なセレクト&操作関数
それでは、実際の現場でそのまま使える、堅牢性を極めたVBAモジュールを公開しよう。このコードは、パーツファイル内の指定フィーチャ(例: 穴やカット)を確実に選択し、安全に処理するためのテンプレートだ。
Option Explicit
Sub ProductionReady_FeatureOperation()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim targetFeatureName As String
Dim isSelected As Boolean
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
‘ アクティブドキュメントの存在チェック
If swModel Is Nothing Then
MsgBox “アクティブなドキュメントが存在しません。”, vbCritical, “致命的エラー”
Exit Sub
End If
targetFeatureName = “MyTargetCut1” ‘ 処理対象のフィーチャ名
‘ ==========================================
‘ 1stステップ:標準のSelectByID2による高速選択
‘ ==========================================
isSelected = swModel.Extension.SelectByID2(targetFeatureName, “FEATURE”, 0, 0, 0, False, 0, Nothing, 0)
‘ ==========================================
‘ フォールバック処理:1stステップ失敗時の救済措置
‘ ==========================================
If Not isSelected Then
Debug.Print “警告: 標準セレクトに失敗しました。フィーチャー走査によるフォールバックを実行します。”
‘ 代替手段として、フィーチャーツリーを直接走査して選択を試みる
isSelected = FallbackSelectByName(swModel, targetFeatureName)
If Not isSelected Then
‘ 完全敗北:ここでマクロを止めず、安全に離脱する
MsgBox “対象フィーチャ ‘” & targetFeatureName & “‘ が見つかりませんでした。” & vbCrLf & _
“モデルの構成を確認してください。”, vbExclamation, “処理中断”
Exit Sub
End If
End If
‘ ==========================================
‘ 安全な後続処理(選択が保証された状態で実行)
‘ ==========================================
Debug.Print “成功: フィーチャの選択に成功しました。後続処理を実行します。”
‘ 例:選択されたフィーチャを編集・または削除するなどの実務処理
‘ swModel.EditDelete など
‘ 選択状態のクリア(メモリリーク・意図せぬ二重選択の防止)
swModel.ClearSelection2 True
End Sub
/
- 【フォールバック用ヘルパー関数】
- 名前指定セレクトが失敗した際、Featureオブジェクトを直接舐めて選択状態を作る関数
/
Private Function FallbackSelectByName(ByVal swModel As SldWorks.ModelDoc2, ByVal featName As String) As Boolean
Dim swFeat As SldWorks.Feature
Dim swSubFeat As SldWorks.Feature
Dim found As Boolean
found = False
Set swFeat = swModel.FirstFeature
‘ ツリーの根底から順に走査
Do While Not swFeat Is Nothing
If swFeat.Name = featName Then
‘ Object自体を選択状態にする(Mark = 0, Append = False)
found = swFeat.Select2(False, 0)
Exit Do
End If
‘ サブフィーチャ(パターンやミラー内など)も再帰的にチェックする場合の処理をここに記述可能
Set swFeat = swModel.NextFeature
Loop
FallbackSelectByName = found
End Function
—
チーフアーキテクトからの現場への提言
ファイルやデータベース(PDMや外部Excel等)と連携する大規模なマクロ開発において最も恐ろしいのは、「エラーで止まること」そのものではない。「エラーハンドリングの欠如により、中途半端にモデルが改変された状態でファイルが上書き保存されてしまうこと」だ。
`SelectByID2` の戻り値を無視するプログラミングは、目隠しをして時速100キロで高速道路を逆走するようなもの。
今回紹介した「戻り値の即座の評価」「失敗時のフォールバック関数」「最後に必ず実施する選択クリア(`ClearSelection2`)」の3原則をあなたのコードに義務付ければ、SolidWorksマクロの生還率は劇的に跳ね上がり、現場からの信頼も勝ち取ることができる。
プロフェッショナルたるもの、APIの「気まぐれ」をコードの美しさでねじ伏せろ。
