【入門編】【実務中級】アセンブリ内の特定パーツに設定されている材料情報を一括取得し、部品ごとの総重量をExcelへ出力する – SolidWorks VBA解析バイブル

スポンサーリンク

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 = …` を追加すれば、そのまま重量管理表が完成します。

自動化の醍醐味は、「面倒な反復作業を機械に任せ、人間は設計という創造的な活動に没頭すること」にあります。このコードをベースに、皆さんの業務に合わせてカスタマイズしてみてください。

「ここが動かない」「もっとこうしたい」という悩みがあれば、いつでも相談してください。エンジニアとして、皆さんの自動化ライフを全力で応援します。

さあ、次はどんな面倒な作業を自動化しましょうか?

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