【SolidWorks VBA】「マクロの記録」から卒業せよ!アセンブリ内の部品を自在に操る『GetComponents』の極意
こんにちは。現場で泥臭い自動化を積み重ね、SolidWorks APIの深淵を見てきたエンジニアです。
「マクロの記録」ボタンを押して、生成されたコードの羅列に絶望したことはありませんか?実は、アセンブリ内の部品を特定するのに、マクロの記録はほとんど役に立ちません。なぜなら、マクロの記録は「マウス操作」をなぞるだけで、「部品の名前を指定して処理する」というプログラミングの核心に触れていないからです。
今日は、アセンブリ内の部品を名前で検索し、自在に操るための「第一歩」となる`GetComponents`メソッドについて解説します。ここをマスターすれば、貴方の自動化スキルは一気に一段階上のステージへ進みます。
—
1. なぜ「GetComponents」なのか?
SolidWorksのアセンブリ構造は、いわば「親子関係にあるオブジェクトの木構造」です。アセンブリ(親)の中に部品(子)があり、その中にフィーチャー(孫)がある。この木構造を辿り、特定の部品を探し出すための「魔法の鍵」が`GetComponents`です。
これを使うと、アセンブリ内に存在するすべての部品(コンポーネント)を、一瞬で「配列」として引きずり出すことができます。
2. 実践コード:名前で部品を探し出せ!
まずは、以下のコードをコピーして、VBAエディタ(Alt+F11)に貼り付けてみてください。
Sub FindComponentByName()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swAssy As SldWorks.AssemblyDoc
Dim swComp As SldWorks.Component2
Dim vComps As Variant
Dim i As Long
Dim targetName As String
‘ 1. SolidWorksとアクティブなドキュメントの接続
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
‘ アセンブリ以外なら終了
If swModel Is Nothing Or swModel.GetType <> swDocASSEMBLY Then
MsgBox “アセンブリを開いて実行してください。”
Exit Sub
End If
Set swAssy = swModel
targetName = “Bolt-1” ‘ ここに探したい部品名(拡張子なし)を入力
‘ 2. アセンブリ内の全コンポーネントを取得
vComps = swAssy.GetComponents(False)
‘ 3. ループ処理で目的の部品を探索
For i = 0 To UBound(vComps)
Set swComp = vComps(i)
‘ コンポーネントの名前を比較 (Name2は完全なパスを含むため注意)
If swComp.Name2 Like targetName & “” Then
MsgBox “発見しました!: ” & swComp.Name2
‘ ここで合致させたり、色を変えたりする処理を記述
Exit Sub
End If
Next i
MsgBox “部品が見つかりませんでした。”
End Sub
—
3. このコードの「ここが重要」
初心者の方が必ずと言っていいほど躓くポイントを、先輩として解説します。
- `GetComponents(False)`の意味
この`False`は「トップレベルのコンポーネントのみを取得する」という意味です。もしアセンブリの中にサブアセンブリがあり、その中の部品まで再帰的に探したい場合は、別の手法(再帰処理)が必要になります。まずはここから始めましょう。
- `Name2`の正体
`swComp.Name2`は、FeatureManagerデザインツリーに表示されている名前です。部品を複数配置すると「Bolt-1」「Bolt-2」のように自動で番号が振られます。`Like`演算子を使って`targetName & “”`とすることで、後ろの番号が何であれマッチングできるように工夫しています。
- なぜ「配列」なのか?
`vComps`はVariant型の配列です。配列に格納することで、何百という部品があっても、メモリ上で高速にループ処理(検索)を回せるようになります。これが「マクロの記録」にはできない、プログラミングによる高速化の極意です。
4. 陥りやすいエラーと対策
1. 「オブジェクト変数またはWithブロック変数が設定されていません」
→ ほとんどの場合、アセンブリ以外のファイル(部品ファイルなど)で実行した時に発生します。`If swModel.GetType <> swDocASSEMBLY` のようなチェック処理を必ず入れましょう。
2. 部品が見つからない
→ `Name2`は、ツリー上の「名前」であって「ファイル名」ではありません。また、コンフィギュレーションによって名前が変わることもあります。最初は`Debug.Print swComp.Name2`を使って、イミディエイトウィンドウに名前を出力し、実際に何という名前で認識されているかを確認する癖をつけてください。
—
最後に:ここをクリアすれば世界が変わる
「プログラムで部品を探す」ということは、SolidWorksに「どの部品をどうしたいか」を指示できるようになった、ということです。これができれば、部品の入れ替え、自動合致(Mate)の追加、プロパティの自動書き込みなど、あらゆる自動化への扉が開かれます。
まずはこのコードを動かし、「名前で部品を特定できた!」という小さな成功体験を積み重ねてください。それが、貴方が真の自動化エンジニアへと進化するための確実な一歩です。
何か分からないことがあれば、いつでも聞いてください。焦らず、一歩ずつ進んでいきましょう。
