SolidWorks VBAを掌握せよ:アセンブリ重量・材質の一括抽出で「脱・手作業」を実現する
こんにちは。自動化の現場で血肉を削ってきたエンジニアとして、今日は皆さんに「SolidWorksのデータをいかに美しく、かつ高速に調理するか」という極意を伝授します。
「マクロの記録」ボタンを押して出てきたコードを眺めるだけの段階は、もう終わりにしましょう。今日紹介するのは、アセンブリ内のパーツを走査し、材質と重量をExcelへ流し込むという、実務で最も要望の多い自動化タスクです。
—
1. なぜ「マクロの記録」では限界があるのか?
SolidWorksの「マクロの記録」はあくまでユーザー操作の模倣に過ぎません。しかし、今回のような「一括抽出」には、API(Application Programming Interface)の理解が不可欠です。
- 再帰処理の壁: アセンブリの中にサブアセンブリがある場合、記録機能では対応できません。
- メモリの扱い: 大規模アセンブリで無闇にパーツを開くと、PCは悲鳴を上げます。
- 非表示コンポーネント: 表示されていない部品も見逃さない「走査ロジック」が必要です。
これらをクリアするために、`IComponent2` インターフェースを軸にした、プロフェッショナルな設計を学びましょう。
—
2. 実践:重量・材質一括集計マクロ
このコードは、現在開いているアセンブリの全コンポーネントを再帰的に探索し、材質名と質量をイミディエイトウィンドウに出力します。これをExcelに書き出す準備段階の核となるロジックです。
Option Explicit
‘ SolidWorks APIの定数定義
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Sub GetAssemblyData()
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
If swModel Is Nothing Or swModel.GetType <> swDocASSEMBLY Then
MsgBox “アセンブリを開いてください。”
Exit Sub
End If
‘ ルートコンポーネントを取得して再帰処理を開始
Dim swRootComp As SldWorks.Component2
Set swRootComp = swModel.ConfigurationManager.ActiveConfiguration.GetRootComponent3(True)
Debug.Print “部品名, 材質, 重量(g)”
TraverseComponents swRootComp
End Sub
‘ コンポーネントを再帰的に探索するプロシージャ
Sub TraverseComponents(swComp As SldWorks.Component2)
Dim vChildren As Variant
vChildren = swComp.GetChildren
Dim i As Integer
For i = 0 To UBound(vChildren)
Dim swChild As SldWorks.Component2
Set swChild = vChildren(i)
‘ コンポーネントのモデルドキュメントを取得
Dim swCompModel As SldWorks.ModelDoc2
Set swCompModel = swChild.GetModelDoc2
If Not swCompModel Is Nothing Then
‘ 材質名を取得
Dim matName As String
matName = swCompModel.MaterialPropertyName
‘ 質量特性を取得(MassPropertyオブジェクトを使用)
Dim swMass As SldWorks.MassProperty
Set swMass = swCompModel.Extension.CreateMassProperty
Debug.Print swChild.Name2 & “, ” & matName & “, ” & swMass.Mass 1000
‘ サブアセンブリがある場合はさらに深く潜る
TraverseComponents swChild
End If
Next i
End Sub
—
3. コードの「急所」を解説
このコードを理解すれば、SolidWorks VBAの8割はマスターしたも同然です。
① 再帰処理(Recursion)の魔力
`TraverseComponents` の中で自分自身を呼び出していますね。これが「再帰」です。アセンブリが10階層あろうが100階層あろうが、この関数は自動的に底まで潜ります。これが自動化エンジニアの「手」となります。
② MassPropertyの活用
`CreateMassProperty` は、SolidWorksの計算エンジンを直接叩くためのメソッドです。手計算や推測ではなく、CAD内部で計算された「正確な物理値」を抽出するため、見積もり精度が劇的に向上します。
—
4. 陥りやすいエラーと対処法
現場でよくあるトラブルとその解決策を共有します。
- 「Object Variable Not Set」エラー:
- 原因: サブアセンブリが「抑制(Suppressed)」されていると、`GetModelDoc2` は `Nothing` を返します。
- 対策: `If Not swCompModel Is Nothing Then` で必ず存在チェックを行ってください。
- 計算が遅い:
- 原因: 毎回モデルを開いていると負荷がかかります。
- 対策: `GetMassProperties` は軽量パーツならそのままで良いですが、超巨大アセンブリの場合は、あらかじめ「質量特性」をアクティブな状態にしておく工夫が必要です。
—
5. 次のステップ:Excelへの橋渡し
上記のコードをExcel VBA(標準モジュール)に移植し、`Cells(row, col).Value = …` を追加すれば、そのまま重量管理表が完成します。
自動化の醍醐味は、「面倒な反復作業を機械に任せ、人間は設計という創造的な活動に没頭すること」にあります。このコードをベースに、皆さんの業務に合わせてカスタマイズしてみてください。
「ここが動かない」「もっとこうしたい」という悩みがあれば、いつでも相談してください。エンジニアとして、皆さんの自動化ライフを全力で応援します。
さあ、次はどんな面倒な作業を自動化しましょうか?
