こんにちは! SolidWorks自動化の現場で泥臭く、かつエレガントなシステムを構築し続けている先輩エンジニアです。
「マクロの記録」ボタンを押して得られたコードをそのまま動かしてみたら、なんだか遅いし、意図しないコンフィギュレーションが選択されてエラーが出る……そんな壁にぶつかっていませんか?
今回は、大規模なマルチコンフィギュレーション(設定)を持つパーツファイルを相手に、VBAから爆速でコンフィギュレーションを切り替え、それぞれの「質量」を自動集計してイミディエイトウィンドウにレポートする実務直結のマクロを一緒に作っていきましょう。
ここをクリアすれば、あなたも「マクロの記録」の呪縛から完全に解放され、SolidWorks APIの真の力を使えるようになります。さあ、一歩先の世界へ進みましょう!
—
1. なぜ「マクロの記録」だけではダメなのか?
SolidWorksでコンフィギュレーションを切り替える操作をマクロ記録すると、次のようなコードが出力されます。
‘ マクロ記録の典型例
boolstatus = Part.Extension.SelectByID2(“Default@Part1.sldprt”, “CONFIGURATION”, 0, 0, 0, False, 0, Nothing, 0)
これ、実は実務では使い物になりません。なぜなら、「画面上のどこを選択しているか(セレクション)」に依存しているため、モデルのツリー構造が変わったり、ファイル名が変わったりしただけで簡単にクラッシュしてしまうからです。
さらに、マルチコンフィギュレーションのパーツで全設定のデータを総なめしようとすると、グラフィックの再描画(画面更新)が走るたびにPCのファンが唸り声を上げ、処理がもの凄く遅くなります。
伝説のエンジニアが教える極意
> 「UI(画面)を操作するな、APIを直撃せよ」
画面をクリックさせるのではなく、ConfigurationManagerという頭脳(API)に直接「この設定に切り替えろ!」と命令し、さらに画面の描画を一時停止(サスペンド)させること。これが、爆速マクロを作る唯一にして最大の秘訣です。
—
2. 実装の全体像とアーキテクチャ
今回作成するVBAマクロのフローは以下の通りです。
1. アクティブなドキュメントとモデルの取得(安全装置付き)
2. 画面描画の一時停止(`Visible = False` または `EnableGraphics = False`)
3. 全コンフィギュレーション名の取得
4. ループ処理でコンフィギュレーションを高速切り替え(`ShowConfiguration2`を使用)
5. 各設定の質量(Mass)を抽出し、配列やイミディエイトに蓄積
6. 処理終了後の画面描画再開とレポート出力
特に重要なのが、設定を切り替える `ConfigurationManager.ShowConfiguration2` というメソッドです。これこそが、画面を介さずに一瞬でコンフィギュレーションを切り替える魔法のAPIです。
—
3. 実務仕様:コンフィギュレーション別 質量自動集計マクロ
以下のコードを、SolidWorksのVBAエディタ([Alt] + [F11])の標準モジュールに貼り付けてください。
Option Explicit
‘ ==============================================================================
‘ 【テーマ】コンフィギュレーション別 質量自動集計マクロ
‘ 概要: アクティブなパーツの全設定を高速巡回し、それぞれの質量を抽出してレポートする
‘ ==============================================================================
Sub ReportConfigurationMass()
‘ 1. アプリケーションとドキュメントの取得
Dim swApp As SldWorks.SldWorks
Set swApp = Application.SldWorks
Dim swModel As SldWorks.ModelDoc2
Set swModel = swApp.ActiveDoc
‘ 安全装置:ドキュメントが開かれているか、それが「パーツ」であるかチェック
If swModel Is Nothing Then
MsgBox “アクティブなドキュメントがありません。”, vbCritical, “エラー”
Exit Sub
End If
If swModel.GetType <> swDocPART Then
MsgBox “このマクロは「パーツ(Part)」ファイルでのみ実行可能です。”, vbExclamation, “対象外”
Exit Sub
End If
‘ 2. 爆速化の要:画面描画を一時停止し、バックグラウンドで処理させる
swModel.ActiveView.EnableGraphics = False
swApp.GetUserPreferenceToggle (swUserPreferenceToggle_e.swViewDisplayRealView) ‘ 必要に応じて軽量化
Dim swConfMgr As SldWorks.ConfigurationManager
Set swConfMgr = swModel.ConfigurationManager
Dim currentConfigName As String
currentConfigName = swConfMgr.ActiveConfiguration.Name
‘ 3. すべてのコンフィギュレーション名を取得
Dim vConfigNames As Variant
vConfigNames = swModel.GetConfigurationNames()
Dim i As Long
Dim configName As String
Debug.Print “========================================”
Debug.Print “【コンフィギュレーション別 質量レポート】”
Debug.Print “対象ファイル: ” & swModel.GetPathName()
Debug.Print “—————————————-”
‘ 4. コンフィギュレーションの数だけループ
For i = LBound(vConfigNames) To UBound(vConfigNames)
configName = vConfigNames(i)
‘ ★極意:ShowConfiguration2で爆速切り替え
Dim success As Boolean
success = swConfMgr.ShowConfiguration2(configName)
If success Then
‘ 質量取得のためのMassPropertyオブジェクトを取得
Dim swMassProp As SldWorks.MassProperty
Set swMassProp = swModel.Extension.CreateMassProperty()
If Not swMassProp Is Nothing Then
‘ 精度の設定(必要に応じて)
swMassProp.UseSystemUnits = True ‘ システム単位系を使用
‘ 質量(キログラム単位等、ドキュメント設定に依存)を抽出
Dim mass As Double
mass = swMassProp.Mass
‘ イミディエイトウィンドウに出力(単位はgまたはkg。環境に依存)
Debug.Print “設定名: ” & Left(configName & Space(30), 30) & ” | 質量: ” & Format(mass, “0.000”) & ” kg”
Else
Debug.Print “設定名: ” & configName & ” | 質量取得失敗 (MassProperty is Nothing)”
End If
Else
Debug.Print “設定名: ” & configName & ” | 切り替え失敗”
End If
Next i
‘ 5. 元のコンフィギュレーションに戻す
swConfMgr.ShowConfiguration2 (currentConfigName)
‘ 6. 画面描画の復元(絶対に忘れてはいけない!)
swModel.ActiveView.EnableGraphics = True
swModel.WindowRedraw
Debug.Print “========================================”
Debug.Print “すべての処理が正常に完了しました。”
MsgBox “コンフィギュレーション別の質量集計が完了しました。\n[Ctrl + G] でイミディエイトウィンドウを確認してください。”, vbInformation, “完了”
End Sub
—
4. コードの深掘り解説:ここがエンジニアの腕の見せ所
初心者の方に向けて、コードの重要なポイントを3つに絞って噛み砕いて解説します。
① `swModel.ActiveView.EnableGraphics = False`
これこそがプロの技です。通常、SolidWorksは設定を切り替えるたびに「3Dグラフィックの再描画」を行おうと必死になります。これが処理を数倍〜数十倍遅くする原因です。
`EnableGraphics = False` にすることで、「目に見えない裏側で黙々と計算だけをしろ」とSolidWorksに命令できます。処理が終わったら必ず `True` に戻すのを忘れないでください(戻し忘れると画面が真っ白で固まったように見えます)。
② `swConfMgr.ShowConfiguration2(configName)`
マクロ記録が生成する冗長な選択コードを排除し、コンフィギュレーションマネージャーに対して直接文字列(設定名)で切り替えを指示します。非常に堅牢(エラーが起きにくい)で、かつ高速です。
③ `swModel.Extension.CreateMassProperty()`
ジオメトリの質量や重心、体積を計算するための専用オブジェクトです。パーツの形状がコンフィギュレーションごとに異なっていても、設定を切り替えた直後にこのオブジェクトを生成・評価することで、その瞬間の正確な物理特性を抜き出すことができます。
—
5. 陥りやすいエラーと対策(トラブルシューティング)
実務でこのマクロを動かす際、以下の罠にハマることがあります。
- エラー:「オブジェクト変数または With ブロック変数が見つかりません。」 (`9` または `424`)
- 原因: パーツが開かれていない状態で実行した、あるいはアセンブリファイルで実行してしまった。
- 対策: コード内の `swModel.GetType <> swDocPART` のガード節で弾くようにしていますが、アセンブリ(`swDocASSEMBLY`)にも拡張したい場合は、`MassProperty` の挙動が少し変わる点に注意してください(アセンブリの場合はコンポーネントの貫通計算が必要になることがあります)。
- 質量がすべて「0」またはおかしな値になる
- 原因: 設定を切り替えた直後、まれにジオメトリの再計算(Rebuild)が追いついていないケースがあります。
- 対策: もしモデルが重くて値がおかしい場合は、切り替えの直後に `swModel.ForceRebuild3(False)` を挟むと確実です(ただし処理速度は少し落ちます)。
—
おわりに:ここをクリアすれば、基本はバッチリ!
今回は、`ConfigurationManager.ShowConfiguration2` を使った高速な設定切り替えと、`MassProperty` を組み合わせた実務的な質量集計のテクニックを解説しました。
「画面を操作するな、APIを直撃せよ」。このマインドセットを持つだけで、あなたが書くVBAマクロの速度と安定性は劇的に向上します。日々の苦痛なルーチンワークをコードで瞬殺し、よりクリエイティブな設計業務に時間を使いましょう。
それでは、良きSolidWorks自動化ライフを!
