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

スポンサーリンク

SolidWorks APIの深淵:アセンブリ重量・材質解析の極致

「アセンブリを開いて、手動でひとつずつプロパティを確認し、Excelに転記する」。
もしあなたが今、そんな原始的な作業を繰り返しているのなら、今すぐその手を止めてください。設計エンジニアの時間は、データの転記作業のためにあるのではありません。

今日は、SolidWorks APIを使い倒し、アセンブリ内の全コンポーネントから「材質」と「質量」を瞬時に抽出し、Excelへレポート出力する堅牢かつ高速な自動化アーキテクチャを伝授します。

—

1. なぜ「素人コード」は破綻するのか?

多くのVBA初心者が陥る罠は、再帰処理の設計ミスとオブジェクトの解放漏れです。
アセンブリには「サブアセンブリ」が存在します。単純なループ処理では最下層の部品(Part)まで到達できず、計測漏れが発生します。また、API呼び出しごとにExcelセルへ直接書き込むようなコードは、実行速度を劇的に低下させます。

成功するための3つの鉄則

1. 再帰関数(Recursive Function)の活用: 階層構造を恐れず、ルートから末端までフラットに走査するアルゴリズムを組む。
2. メモリ管理: `swModel` や `swComponent` は、処理が終わるごとに適切に参照をクリアする(VBAでは自動解放を過信しない)。
3. データの一括出力: Excelへの書き込みは最小限に。配列にデータを溜め込み、最後に一括でセルへ流し込む(これがパフォーマンスの差を生む)。

—

2. プロダクションコード:アセンブリ解析エンジン

このコードは、メインのアセンブリを開いた状態で実行してください。参照設定で `SolidWorks 20xx Type Library` および `Microsoft Excel Object Library` を有効にすることを忘れずに。

Option Explicit

‘ 伝説のアーキテクトによる重量・材質集計ツール
Sub ExportAssemblyProperties()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swAssy As SldWorks.AssemblyDoc
Dim vComps As Variant
Dim results() As Variant
Dim count As Long

Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc

If swModel Is Nothing Or swModel.GetType <> swDocASSEMBLY Then
MsgBox “アセンブリを開いてから実行してください。”, vbCritical
Exit Sub
End If

Set swAssy = swModel
count = 0

‘ 結果格納用配列の初期化
ReDim results(1 To 3, 1 To 1000) ‘ 適宜サイズは調整してください

‘ 再帰処理でコンポーネントを走査
TraverseComponents swAssy.GetComponents(False), results, count

‘ Excelへの一括転記(高速化の肝)
OutputToExcel results, count
End Sub

‘ 再帰的にコンポーネントを巡回する関数
Private Sub TraverseComponents(vComps As Variant, results() As Variant, count As Long)
Dim i As Long
Dim swComp As SldWorks.Component2
Dim swChildModel As SldWorks.ModelDoc2
Dim swMass As SldWorks.MassProperty

If IsEmpty(vComps) Then Exit Sub

For i = LBound(vComps) To UBound(vComps)
Set swComp = vComps(i)

‘ サブアセンブリかどうかの判定
If swComp.GetChildrenCount > 0 Then
TraverseComponents swComp.GetChildren, results, count
Else
‘ 部品(Part)の場合のみ計測
Set swChildModel = swComp.GetModelDoc2
If Not swChildModel Is Nothing Then
count = count + 1
results(1, count) = swComp.Name2
results(2, count) = swChildModel.MaterialPropertyName ‘ 材質名

‘ 質量計算
Set swMass = swChildModel.Extension.CreateMassProperty
results(3, count) = swMass.Mass ‘ kg単位
End If
End If
Next i
End Sub

‘ Excelへの出力処理
Private Sub OutputToExcel(results() As Variant, count As Long)
Dim wb As Object
Dim ws As Object
Set wb = CreateObject(“Excel.Application”)
wb.Visible = True
Set ws = wb.Workbooks.Add.Sheets(1)

ws.Range(“A1:C1”).Value = Array(“部品名”, “材質”, “質量(kg)”)
ws.Range(“A2”).Resize(count, 3).Value = Application.Transpose(results)
End Sub

—

3. 実務運用における注意点(ここがプロの差)

このスクリプトを運用に乗せる際、以下の点に注意してください。

  • コンフィギュレーションの罠: 上記コードは「現在表示されているコンフィギュレーション」の質量を拾います。アセンブリ内でコンフィギュレーションを切り替えて運用している場合は、`swComp.ReferencedConfiguration` を明示的に指定する必要があります。
  • 非表示部品の扱い: `GetComponents(False)` を使用していますが、抑制状態(Suppressed)の部品を含める場合は引数を `True` に変更してください。ただし、抑制部品はロードされていないため、質量計算が正しく行えない場合があります。
  • データベース連携: このデータをそのままCSV出力し、社内のPLMやERPと連携させることで、コスト試算の自動化までシームレスに繋がります。

終わりに

自動化とは、単にコードを書くことではありません。「設計者が本来行うべき思考の時間を、泥臭い作業から解放すること」です。

今回紹介した再帰処理の考え方は、BOMの展開から図面管理に至るまで、SolidWorks API自動化のあらゆる場面で通用する「最強の武器」になります。まずはこのコードをベースに、あなたの現場の仕様に合わせてカスタマイズしてみてください。

もし不明点があれば、またいつでも聞きに来なさい。エンジニアの成長を支援するのは、アーキテクトとしての悦びでもある。

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