マクロの記録から脱却しよう!`SelectByID2`を完全に乗りこなす安全な選択テクニック
SolidWorksで作業を自動化しようと思ったとき、誰もが最初に通る道。それが「マクロの記録」です。
マクロの記録ボタンを押し、画面上の平面やエッジをクリックして、マクロを保存する。生成されたコードを開くと、そこには必ずと言っていいほど、次のメソッドが登場します。
Part.Extension.SelectByID2 “正面”, “PLANE”, 0, 0, 0, False, 0, Nothing, 0
「よし、これで自動化ができるぞ!」と意気揚々と実行してみたものの、翌日、別のモデルで実行したら「なぜか動かない」「エラーも出ずに、全然違う場所が押し出されてしまった」という苦い経験はありませんか?
実は、この `SelectByID2` は非常に強力な反面、「選択の成否を教えてくれるのに、多くの人がその声(戻り値)を無視してしまう」という、初心者が最も陥りやすい罠が潜んでいるのです。
今回は、マクロの記録から一歩踏み出し、実務でも絶対に落ちない「堅牢で優しいマクロ」を書くための、SelectByID2の正しい戻り値判定と、失敗したときの代替処理(フォールバック)について、私と一緒に学んでいきましょう!
—
1. なぜ `SelectByID2` は突然失敗するのか?
具体的なコードを見る前に、なぜ選択が失敗するのか、その理由を整理しておきましょう。主な原因は以下の3つです。
1. 名前が変わってしまった
- コード内では `”正面”` という名前で探しているのに、英語版のSolidWorksで開いたために `”Front Plane”` になっていた。または、ユーザーがフィーチャ名を `”スケッチ平面_01″` などに書き換えていた。
2. 選択対象がそもそも存在しない
- 処理しようとしたパーツに、想定していたスケッチや参照面が存在しなかった。
3. 3次元空間の位置(座標)がズレた
- マクロの記録は、クリックした「X, Y, Z座標」を厳密に記録します。モデルの形状が少し変わっただけで、その座標には「何もない」状態になり、選択に失敗します。
ここで最も恐ろしいのは、「SolidWorksは、選択に失敗してもエラーを出さずに、そのまま次の処理に進んでしまう」という仕様です。
直前の選択が残ったまま次の処理(カットや押し出しなど)が実行され、意図しない形状が破壊されてしまう……。これが、マクロが「暴走」したように見える原因なのです。
—
2. 基本中の基本:戻り値(Boolean)を必ず受け取ろう
`SelectByID2` メソッドは、選択に成功すると `True` を、失敗すると `False` を返します(これを戻り値と呼びます)。
まずは、この戻り値をしっかり変数に受け取り、「成功したときだけ処理を進める」という基本の形を身につけましょう。
✕ 良くない例(戻り値を無視している)
‘ 選択に失敗していても、お構いなしに次の処理(押し出しなど)に進んでしまう
AwesomeDoc.Extension.SelectByID2 “正面”, “PLANE”, 0, 0, 0, False, 0, Nothing, 0
‘ ここでエラーになるか、最悪の場合、直前に手動で選択していた別の面が押し出される
◯ 良い例(戻り値を判定している)
Dim isSelected As Boolean
‘ 戻り値を変数 isSelected で受け取る
isSelected = AwesomeDoc.Extension.SelectByID2(“正面”, “PLANE”, 0, 0, 0, False, 0, Nothing, 0)
‘ 選択が成功したかチェックする
If Not isSelected Then
MsgBox “『正面』プレーンの選択に失敗しました。処理を中断します。”, vbExclamation, “エラー”
Exit Sub ‘ 安全に処理を中断する
End If
これだけでも、マクロの安全性は劇的に向上します。失敗したときに暴走せず、「ここで失敗したよ」と教えてくれる親切な設計になりましたね。
—
3. 一歩先へ:失敗しても諦めない「フォールバック(代替)処理」
「選択に失敗したから処理を止めます」というのは安全ですが、実務で使うマクロとしては、少し物足りないですよね。
例えば、「日本語版の『正面』を探して、もし無ければ英語版の『Front Plane』を探す。それでも無ければ、モデルの最初の平面を自動で取得する」というように、マクロが自ら考えてリカバリーしてくれたら、とても頼もしいと思いませんか?
このように、本命の処理が失敗したときに備える代替ルートのことを、プログラミング用語で「フォールバック(Fallback)」と呼びます。
今回は、初心者の方でも直感的に理解できる「多言語対応(日本語/英語)& 最終防衛ライン」のフォールバック処理を実装してみましょう。
—
4. 【実用コード】安全な選択とフォールバックの実装テンプレート
以下のコードは、そのままコピーしてご自身のマクロに貼り付けて使用できます。何を行っているか、コメントを読みながら追いかけてみてくださいね。
Option Explicit
”’
”’
Sub SafeSelectExample()
‘ SolidWorksのアプリケーションオブジェクトとドキュメントオブジェクトを宣言
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
‘ SolidWorksのインスタンスを取得
Set swApp = Application.SldWorks
‘ 現在アクティブなドキュメント(部品またはアセンブリ)を取得
Set swModel = swApp.ActiveDoc
‘ ドキュメントが開かれていない場合は安全に終了
If swModel Is Nothing Then
MsgBox “SolidWorksで部品またはアセンブリを開いてから実行してください。”, vbCritical, “エラー”
Exit Sub
End If
‘ ———————————————————
‘ ここからが本題:安全な選択処理
‘ ———————————————————
‘ 事前に選択をクリアして、真っ新な状態にする(超重要!)
swModel.ClearSelection2 True
Dim isSelected As Boolean
‘ 【ステップ1】まずは日本語環境の「正面」平面を選択してみる
Debug.Print “ステップ1: ‘正面’ の選択を試みます…”
isSelected = swModel.Extension.SelectByID2(“正面”, “PLANE”, 0, 0, 0, False, 0, Nothing, 0)
‘ 【ステップ2】もし「正面」がなければ、英語環境の「Front Plane」を試す(フォールバック1)
If Not isSelected Then
Debug.Print “-> ‘正面’ が見つかりません。’Front Plane’ で再試行します…”
isSelected = swModel.Extension.SelectByID2(“Front Plane”, “PLANE”, 0, 0, 0, False, 0, Nothing, 0)
End If
‘ 【ステップ3】それでもダメなら、原点(Origin)を試してみる(フォールバック2)
‘ 原点はどの言語環境でも “Origin” または “原点” ですが、”Origin” で共通して取れることが多いです
If Not isSelected Then
Debug.Print “-> 基準平面が見つかりません。’Origin’(原点)の選択を試みます…”
isSelected = swModel.Extension.SelectByID2(“Origin”, “COORDSYS”, 0, 0, 0, False, 0, Nothing, 0)
End If
‘ 【最終判定】すべての手段が失敗した場合
If Not isSelected Then
‘ ユーザーに優しく状況を説明し、マクロを安全に停止する
MsgBox “必要な基準面(正面 / Front Plane / Origin)を選択できませんでした。” & vbCrLf & _
“モデルの設定を確認するか、基準面を手動で作成してください。”, _
vbExclamation, “選択失敗”
Exit Sub
End If
‘ ———————————————————
‘ 選択成功後の処理(例:スケッチの開始など)
‘ ———————————————————
Debug.Print “-> 選択に成功しました! 次の処理に移行します。”
‘ ここに押し出しやスケッチ作成などの処理を書きます
‘ swModel.SketchManager.InsertSketch True
MsgBox “安全に平面を選択できました!次の処理に進みます。”, vbInformation, “成功”
End Sub
—
5. プロがこだわる!このコードの「3つの知恵」
このコードには、一見シンプルですが、実務でトラブルを防ぐためのプロのノウハウが3つ詰め込まれています。
知恵その1:選択を実行する前の `ClearSelection2 True`
SolidWorksでは、マクロを実行する前にユーザーが画面上で何かを「手動選択」していることがよくあります。
もし古い選択が残ったままだと、予期せぬ複数選択状態(マルチセレクト)になり、マクロがバグを起こします。処理を始める前には、必ず `ClearSelection2 True` で選択状態をリセットしましょう。
知恵その2:多言語(マルチランゲージ)への配慮
日本の製造業では、海外の拠点や取引先とCADデータをやり取りすることが日常茶飯事です。
相手が英語OSのSolidWorksで保存したファイルは、平面の名前が `”Front Plane”` になっています。このコードのように、日本語と英語の両方のフォールバックを用意しておくだけで、「海外拠点で動かしたらマクロが止まった!」という国際的なトラブルを未然に防ぐことができます。
知恵その3:段階的なフォールバック(段階的妥協)
「正面」がダメなら「Front Plane」、「それもダメなら確実に存在する『原点(Origin)』」というように、段階的に条件を緩めていく設計にしています。
これにより、ユーザーの手を煩わせることなく、マクロ自身が「今できる最善の選択」を行って処理を続行してくれます。
—
まとめ:ここをクリアすれば、SolidWorks VBAの基本はバッチリです!
マクロの記録から一歩踏み出し、「もし失敗したらどうするか?」をコードに教えてあげること。これが、初心者から「プロのツール開発者」へとステップアップするための第一歩です。
今回のポイントをもう一度おさらいしましょう。
1. `SelectByID2` の戻り値(True/False)は、必ず変数(`isSelected` 等)で受け取る。
2. 失敗した場合は、そのまま進めずに `If Not isSelected Then` で処理を分岐させる。
3. 別の名前や、別のオブジェクト(原点など)を選択する「代替ルート(フォールバック)」を用意する。
この考え方は、平面の選択だけでなく、エッジやスケッチ、フィーチャの選択など、SolidWorks VBAのあらゆる場面で応用できます。
あなたが書いたマクロが、誰の手元でも「絶対に止まらずに優しく動く」頼もしい相棒になるよう、ぜひこのテクニックをあなたのコードに取り入れてみてくださいね。応援しています!
