【入門編】【実務中級】コンフィギュレーション(構成部品の切り替え)をVBAからアセンブリ全体に適用する方法 – SolidWorks VBA解析バイブル

スポンサーリンク

こんにちは!SolidWorks自動化の世界へようこそ。
チーフアーキテクトの私です。

マクロの記録ボタンを押して、ちまちま部品をクリックして……という作業は、今日で卒業にしましょう。
今回は、実務で絶対に避けて通れない「アセンブリ内の特定部品のコンフィギュレーション(構成部品)をVBAから自在に切り替える方法」を伝授します。

「製品のバリエーション違い(A仕様、B仕様)をワンクリックで生成したい」
「アセンブリ全体に配置されたボルトの長さを、VBAから一括で変更したい」

そんな現場の切実な願いを叶える極限の知見を、分かりやすく、かつプロの技でお伝えしていきます。
ここをクリアすれば、あなたのSolidWorks VBAスキルは間違いなく中級者の領域に到達します。さあ、一緒に扉を開きましょう!

—

1. なぜ「コンフィギュレーションの切り替え」でつまづくのか?

SolidWorksを触っている方なら、「コンフィギュレーション」の概念はお馴染みですね。1つのモデルの中に複数の形状やサイズのバリエーションを内包できる非常に強力な機能です。

これをVBAから操作しようとしたとき、多くの人が最初に以下のような壁にぶつかります。

  • 「マクロの記録をしても、どのコードが部品のコンフィギュレーションを指定しているか分からない」
  • 「エラーは出ないのに、なぜか親アセンブリ側の表示が変わらない」
  • 「アセンブリの中に同じ部品が複数あるとき、特定のものだけを変更できない」

原因はシンプルです。SolidWorks APIの「コンポーネント(Component)の概念」と「ドキュメント(ModelDoc2)の概念」を混同しているから。

ここを正しく理解すれば、コードは驚くほど美しく、そして強靭になります。

—

2. 押さえておくべきAPIの基本構造

コンフィギュレーションをVBAから操るためのロードマップは以下の通りです。

1. アセンブリから目的の「構成部品(Component2)」を特定する
2. その構成部品が参照している「参照コンフィギュレーション(ReferencedConfiguration)」のプロパティを書き換える

ここで重要なのは、「部品ファイル(.sldprt)そのもののコンフィギュレーションを変えるのではなく、アセンブリという空間に配置された『インスタンス(部品の置き方)』のコンフィギュレーションを変える」という点です。

これをコードでどう表現するのか、次の実用コードで具体的に見ていきましょう。

—

3. 【実践】アセンブリ全体のコンフィギュレーションを一括切り替えするVBAコード

以下のコードは、アクティブなアセンブリを開いた状態で実行してください。
アセンブリ内に存在する特定の部品名(ファイル名)を検索し、そのコンフィギュレーションを指定の名称に一斉に変更する実用スクリプトです。

Sub SwitchComponentConfiguration()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swAssDoc As SldWorks.AssemblyDoc
Dim vComponents As Variant
Dim swComp As SldWorks.Component2
Dim i As Long

‘ — 設定エリア —
Const TARGET_PART_NAME As String = “Bracket-1” ‘ 変更したい部品名(拡張子なし、またはインスタンス名)
Const NEW_CONFIG As String = “Large_Type” ‘ 切り替えたいコンフィギュレーション名
‘ ——————

‘ 1. SolidWorksアプリケーションの取得
Set swApp = Application.SldWorks
If swApp Is Nothing Then Exit Sub

‘ 2. アクティブドキュメントの取得
Set swModel = swApp.ActiveDoc
If swModel Is Nothing Then
MsgBox “ドキュメントが開かれていません。”, vbCritical
Exit Sub
End If

‘ 3. アセンブリドキュメントであるかチェック
If swModel.GetType <> swDocASSEMBLY Then
MsgBox “アクティブなドキュメントがアセンブリではありません。”, vbCritical
Exit Sub
End If

Set swAssDoc = swModel

‘ 4. アセンブリ内の全構成部品(ボトムアップ・トップダウン含む)を取得
‘ Trueを指定することで、サブアセンブリ内のコンポーネントも再帰的に取得します
vComponents = swAssDoc.GetComponents(True)

If IsEmpty(vComponents) Then
MsgBox “構成部品が見つかりませんでした。”, vbExclamation
Exit Sub
End If

Dim matchCount As Long
matchCount = 0

‘ 5. 構成部品の配列をループ処理
For i = LBound(vComponents) To UBound(vComponents)
Set swComp = vComponents(i)

‘ 構成部品の「親のモデル名」または「コンポーネント名」がターゲットと一致するか判定
‘ ここではファイル名ベース(例: Bracket-1)で比較します
If LCase(swComp.Name2) Like LCase(TARGET_PART_NAME) & “” Then

‘ ★ここが核心:参照コンフィギュレーションを変更する
Dim boolstatus As Boolean
boolstatus = swComp.ReferencedConfiguration(NEW_CONFIG)

If boolstatus Then
matchCount = matchCount + 1
End If

End If
Next i

‘ 6. 画面を強制再描画(これ重要!)
swModel.EditRebuild3

‘ 7. 完了報告
MsgBox “処理が完了しました。” & vbCrLf & _
“対象部品: ” & TARGET_PART_NAME & vbCrLf & _
“変更コンフィグ: ” & NEW_CONFIG & vbCrLf & _
“変更適用数: ” & matchCount & “件”, vbInformation

End Sub

—

4. コードの解説と「実務でハマりやすい罠」

上記のコードには、プロのエンジニアが現場で必ず組み込むべき「3つの知見」が詰まっています。

① `GetComponents(True)` でサブアセンブリの奥底まで狙い撃つ

引数に `True` を渡すことで、メインアセンブリの直下だけでなく、その中にあるサブアセンブリの階層深くに隠れている部品まで一網打尽に取得できます。実務の巨大なアセンブリ構造ではこれが必須です。

② `swComp.ReferencedConfiguration` の破壊力

部品のコンフィギュレーションを変えるAPIとして `SetConfiguration` のようなメソッドを探しがちですが、コンポーネント単位で操作する場合は `ReferencedConfiguration` プロパティ(またはメソッド) に新しいコンフィギュレーション名代入(または引数指定)するのが正解です。
ここを知らずにドキュメント側のAPIを叩いてしまい、「あれ?アセンブリ全体が変なことになった……」と悩む初心者が後を絶ちません。

③ 処理後の `swModel.EditRebuild3`

APIでモデルの構造や状態を変更した直後のSolidWorksは、画面の見た目と内部データが乖離していることがあります。最後に必ず再構築(Rebuild)を入れることで、意図しない表示崩れを防ぎます。

—

5. さらに実務を加速させるための応用テクニック

もし「特定の部品すべて」ではなく、「特定のフォルダーに入っている部品だけ」や「特定の条件を満たすインスタンスだけ」を対象にしたい場合は、ループ内で `swComp.GetSuppression`(抑制状態の取得)や `swComp.IsFixed`(固定状態の取得)などの条件分岐を組み合わせると、さらに自動化の精度が上がります。

—

まとめ:ここをクリアすれば、SolidWorks VBAは怖くない!

今回は「アセンブリ内の構成部品のコンフィギュレーション切り替え」という、実務直結のテーマを解説しました。

  • 部品そのもののコンフィグと、アセンブリ上の配置(コンポーネント)のコンフィグは別物である。
  • `ReferencedConfiguration` を使いこなせば、バリエーション展開は一瞬で終わる。

この2点さえ押さえておけば、もうマクロの記録に頼る必要はありません。ご自身の業務に合わせてカスタマイズし、退屈な手作業からエンジニアリングを解放してください。

それでは、次回の極限の知見でお会いしましょう。お疲れ様でした!

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