【入門編】【実務効率化】ModelDocExtension.SelectByID2の戻り値判定を用いた存在しない参照面選択時の動的フォールバック処理 – SolidWorks VBA解析バイブル

スポンサーリンク

SolidWorks VBAの「壁」を越える!参照面が消えても止まらない、超実践的な選択処理テクニック

皆さん、こんにちは!SolidWorks VBAの世界へようこそ。伝説の業務自動化エンジニアとして、皆さんの設計効率を劇的に向上させるための「秘術」を、今回は特別に伝授したいと思います。

「マクロの記録」から一歩踏み出し、より賢く、より頑丈なマクロを書きたいと思いませんか?特に、設計変更によって参照面が消えてしまい、マクロが途中で止まってしまう…そんな経験はありませんか?

今回は、そんな悩みをズバッと解決する、「ModelDocExtension.SelectByID2の戻り値判定を用いた動的フォールバック処理」という、ちょっと専門的な響きですが、実はとっても実用的で、皆さんのマクロ開発の「壁」を軽々と乗り越えるための強力なテクニックをご紹介します。

ここをマスターすれば、SolidWorks VBAの基本がグッと身につき、より実践的な自動化への道が開けますよ!さあ、一緒に「賢いマクロ」の世界へ飛び込みましょう!

なぜ「参照面」の選択は難しいのか? 〜マクロ記録の落とし穴〜

SolidWorks VBAでは、フィーチャーを作成したり、寸法の参照を設定したりする際に、特定の面やエッジ、頂点などを「選択」する必要があります。多くの初学者の皆さんは、まず「マクロの記録」機能を使って、この選択操作を自動化しようとします。

例えば、ある参照面にスケッチを作成するマクロを記録すると、以下のようなコードが生成されることがあります。

‘ マクロ記録で生成される可能性のあるコード例
ActiveModel.Extension.SelectByID2(“参照面1”, “FACE”, 0.0, 0.0, 0.0, False, 0, Nothing, 0)

このコードは、記録された時点では確かに「参照面1」という名前の面を選択してくれます。しかし、ここで大きな落とし穴があるんです。

もし、設計変更によって「参照面1」という名前の面が削除されたり、形状が変わってしまったりしたらどうなるでしょうか?

マクロが実行された際に、指定した名前の面が見つからなくなります。すると、`SelectByID2`メソッドはエラーを発生させ、マクロはそこで強制終了してしまいます。

「せっかく作ったマクロが、ちょっとした設計変更で動かなくなってしまう…」

これでは、業務効率化どころか、かえって手間が増えてしまいますよね。

`SelectByID2` の「秘密」〜戻り値で真実を知る〜

そこで登場するのが、`SelectByID2`メソッドの「戻り値」です。実は、このメソッドは、選択が成功したかどうかを示すブール値(True/False)を返してくれるんです。

  • True: 選択が成功した
  • False: 選択が失敗した(指定した要素が見つからなかった、など)

この戻り値を利用することで、マクロは「選択が成功したかどうか」を自分で判断できるようになります。そして、もし選択に失敗した場合に、あらかじめ用意しておいた「代替処理」を実行させることができるのです。これが「動的フォールバック処理」のキモとなります。

具体的なフォールバック処理とは?

今回のテーマでは、「本来選択したい参照面が見つからなかった場合、代わりにデフォルトの原点平面(XY平面、XZ平面、YZ平面など)を選択して処理を継続する」というフォールバック処理を実装します。

これにより、たとえ参照面が消滅しても、マクロはエラーで停止することなく、代替の平面を使って処理を続行できる、非常に堅牢なロジックが完成します。

実践!堅牢な選択ロジックを実装しよう

では、実際にコードを書いてみましょう。今回は、新しいパーツファイルを作成し、そこに「指定した参照面」にフィーチャーを作成しようと試みます。もしその参照面がなければ、XY平面にスケッチを作成し、円を作成する、という処理を実装します。

準備:新しいパーツファイルを開く

まずは、SolidWorksアプリケーションオブジェクトと、新しいパーツドキュメントを取得するコードから始めましょう。

‘ SolidWorksアプリケーションオブジェクトを取得
Dim swApp As Object
Set swApp = Application.SldWorks

‘ 新しいパーツファイルを作成
Dim swModel As Object
Set swModel = swApp.NewPart()

‘ モデルドキュメントオブジェクトを取得
Dim swPart As SldWorks.PartDoc
Set swPart = swModel

‘ ModelDocExtensionオブジェクトを取得
Dim swModelDocExt As SldWorks.ModelDocExtension
Set swModelDocExt = swPart.Extension

‘ FeatureManagerオブジェクトを取得
Dim swFeatMgr As SldWorks.FeatureManager
Set swFeatMgr = swPart.FeatureManager

核心部分:`SelectByID2` と戻り値判定

いよいよ、本題の参照面選択部分です。ここでは、`SelectByID2`メソッドの戻り値を確認し、選択の成否に応じて処理を分岐させます。

‘ — 選択処理 —
Dim bRet As Boolean
Dim selectedFace As Object

‘ 選択したい参照面の名前(例: “参照面-A”)
Const TARGET_FACE_NAME As String = “参照面-A”

‘ SelectByID2メソッドで参照面を選択しようと試みる
‘ 引数:
‘ Name: 選択する要素の名前
‘ Type: 選択する要素のタイプ (“FACE”, “EDGE”, “VERTEX”, “SKETCH”, etc.)
‘ X, Y, Z: 要素の座標 (通常は0.0でOK、名前で特定する場合)
‘ Append: Trueなら既存の選択に追加、Falseなら選択をクリアして新規選択
‘ Mark: 選択マーキング (通常は0)
‘ CallTip: マウスカーソルのヒント (通常はNothing)
‘ View: 選択対象が表示されているビュー (通常は0)
bRet = swModelDocExt.SelectByID2(TARGET_FACE_NAME, “FACE”, 0.0, 0.0, 0.0, False, 0, Nothing, 0)

‘ 戻り値で選択の成否を判定
If bRet Then
‘ — 選択成功時の処理 —
MsgBox TARGET_FACE_NAME & ” の選択に成功しました。”, vbInformation

‘ 成功した場合、その参照面に対して何らかの処理を行う
‘ 例:ここにフィーチャー作成やスケッチ作成のコードを記述

Else
‘ — 選択失敗時の処理(フォールバック) —
MsgBox TARGET_FACE_NAME & ” が見つかりませんでした。デフォルトのXY平面に切り替えます。”, vbExclamation

‘ デフォルトのXY平面を選択する
‘ XY平面は “Primary – XY plane” という内部名で参照できます
bRet = swModelDocExt.SelectByID2(“Primary – XY plane”, “PLANE”, 0.0, 0.0, 0.0, False, 0, Nothing, 0)

If bRet Then
MsgBox “デフォルトのXY平面への選択に成功しました。”, vbInformation
‘ フォールバックとしてXY平面に対して何らかの処理を行う
‘ 例:ここにXY平面にスケッチを作成するコードを記述

‘ 例:XY平面にスケッチを作成
Dim swSketchMgr As SldWorks.SketchManager
Set swSketchMgr = swPart.SketchManager

swSketchMgr.InsertSketch True ‘ 新規スケッチを開始
‘ スケッチの作成対象として、現在選択されているXY平面を使用
‘ swSketchMgr.CreateCircle 0.01, 0.01, 0.0, 0.05, 0.05 ‘ 例: 中心(0.01, 0.01), 半径0.05の円を作成

‘ スケッチを終了
‘ swSketchMgr.InsertSketch False
Else
MsgBox “デフォルトのXY平面の選択にも失敗しました。処理を中断します。”, vbCritical
‘ どちらの選択も失敗した場合の処理
Exit Sub
End If
End If

コードの解説とポイント

  • `Const TARGET_FACE_NAME As String = “参照面-A”`: 選択したい参照面の名前を定数で定義しています。実際の設計データに合わせて、この名前は変更してください。
  • `swModelDocExt.SelectByID2(…)`: ここが核心部分です。
  • 第1引数に要素の名前、第2引数に要素のタイプ(`”FACE”`, `”PLANE”`, `”EDGE”`, `”VERTEX”`など)を指定します。
  • 第6引数 `Append` を `False` にすることで、毎回選択をクリアしてから新規選択を行います。
  • `If bRet Then … Else … End If`: `SelectByID2`メソッドの戻り値 (`bRet`) を使って、処理を分岐させています。
  • `bRet` が `True` なら、指定した参照面の選択に成功したので、その参照面に対する処理に進みます。
  • `bRet` が `False` なら、参照面が見つからなかった(選択に失敗した)ので、`Else`ブロック内のフォールバック処理に移ります。
  • フォールバック処理: `Else`ブロック内では、`”Primary – XY plane”` という内部名を使ってXY平面を選択しています。SolidWorksには、原点平面(XY, XZ, YZ)や原点(Origin)など、基本的な要素を参照するための内部名がいくつか用意されています。
  • `”Primary – XY plane”`: XY平面
  • `”Primary – XZ plane”`: XZ平面
  • `”Primary – YZ plane”`: YZ平面
  • `”Origin”`: 原点

これらの内部名は、マクロの記録機能を使って確認することもできます。

  • ネストした `If bRet Then … Else … End If`: フォールバックとして選択したXY平面の選択にも失敗する可能性もゼロではありません。そのため、ここでも再度 `SelectByID2` の戻り値を確認し、万が一の場合に備えています。

陥りやすいエラーとその回避策

1. 要素名のスペルミス・大文字小文字の間違い: `SelectByID2` は、指定された名前と完全に一致しないと失敗します。マクロの記録で正確な名前を確認するか、設計者が使用する面名と一致させるように注意しましょう。
2. 要素タイプの指定間違い: `”FACE”` と指定すべきところを `”PLANE”` と間違えたりすると、期待通りに選択できません。これもマクロの記録で確認するのが確実です。
3. `Append` 引数の誤解: `Append` を `True` にしたまま、複数の要素を選択しようとすると、意図しない選択状態になることがあります。通常、単一の要素を選択して処理する場合は `False` にするのが安全です。
4. 参照面が存在しない、または名前が変わった: これが今回のテーマの根本原因です。`SelectByID2` の戻り値判定とフォールバック処理で解決します。
5. 原点平面の内部名の誤り: `”Primary – XY plane”` のような内部名は、SolidWorksのバージョンや言語設定によって微妙に異なる可能性もゼロではありません。もしうまくいかない場合は、一度マクロの記録で原点平面を選択してみて、正確な内部名を確認してください。

さらに賢く!高度なフォールバック戦略

今回の例では、XY平面へのフォールバックを実装しましたが、さらに高度な戦略も考えられます。

  • 複数の代替候補を用意する: XY平面がダメならXZ平面、それもダメならYZ平面、というように、複数の選択肢を用意しておく。
  • ユーザーに選択を促す: フォールバック処理で代替候補が見つからない場合、メッセージボックスでユーザーに「どの平面を選択しますか?」と尋ねる。
  • エラーログの記録: 選択失敗の状況(どの要素が見つからなかったか、いつ発生したかなど)をファイルに記録し、後で原因究明に役立てる。

これらの高度な処理を実装することで、よりプロフェッショナルで、どんな状況でも対応できるマクロを作成することができます。

まとめ:SolidWorks VBAの「壁」を越えるための第一歩

いかがでしたでしょうか?

今回は、`ModelDocExtension.SelectByID2` の戻り値判定を用いた動的フォールバック処理という、SolidWorks VBAにおける非常に実践的で強力なテクニックをご紹介しました。

  • マクロ記録の限界を理解する。
  • `SelectByID2` の戻り値 (`True`/`False`) を活用する。
  • 選択失敗時に、代替処理(フォールバック)を実行させる。
  • 原点平面などの内部名を利用する。

これらのポイントをしっかり押さえることで、皆さんのマクロは設計変更に強く、より信頼性の高いものになります。

「マクロの記録」から脱却し、自分で考えてコードを書く楽しさ、そしてそれがもたらす「劇的な効率化」をぜひ体験してください。

このテクニックは、パーツファイルだけでなく、アセンブリファイルや図面ファイルでも応用可能です。ぜひ、皆さんの日常業務で試してみてください。

SolidWorks VBAの世界は奥深く、まだまだ皆さんに伝えたい「秘術」がたくさんあります。これからも、皆さんの設計業務を加速させるためのヒントを、心を込めてお届けしていきますね!

それでは、また次回のブログでお会いしましょう!

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