こんにちは!SolidWorks VBAの世界へようこそ。
日々、膨大な数のパーツを組み合わせたアセンブリの設計、本当にお疲れ様です。
「あっちの部品の材質を変えたら、全体の総重量はどう変わるんだっけ?」
「設計検証のために、全パーツの重量と材質の一覧表をExcelで提出しなきゃいけない……手作業で電卓を叩くなんて、もう限界!」
そんな悲鳴を現場から聞き続けるあなたへ。今回は、アセンブリ内の全コンポーネントから「材質」と「質量特性(重量など)」をごっそり自動取得し、美しいExcel品質レポートとして一瞬で出力する実務直結型マクロを授けましょう。
ここをクリアすれば、マクロの記録という「お遊戯」から卒業し、あなたも立派なSolidWorks自動化エンジニアの仲間入りです。温かく導きますので、気負わずに一緒にコードの世界へ飛び込んでいきましょう!
—
なぜ「手作業」ではなく「VBA」なのか?(本質を理解する)
アセンブリの重量計算を人手でやると、どうなるでしょう?
1. パーツを開く
2. 材料を確認する
3. 質量特性を開いてメモる
4. Excelに転記する
これを100点、200点の部品に対して行うと……想像するだけで恐ろしいですね。ヒューマンエラーの温床です。
SolidWorks APIを使えば、アセンブリを開いている状態で、メモリ上の各コンポーネント(部品)に一瞬でアクセスし、裏側で計算された質量特性をプログラムの変数に引き抜くことができます。ファイルを一個ずつ開く必要すらないのです。この「メモリ上でスマートに完結させる仕組み」を知るだけでも、あなたのエンジニアとしての視座はグッと高まります。
—
全体設計:どうやってデータを集めてExcelに吐き出すか?
今回のプログラムの処理フローは、たったこれだけです。
1. SolidWorksの現在のアセンブリを取得する
2. アセンブリ内の全構成部品(コンポーネント)のリストを再帰的に取得する
3. 各部品の「ファイル名」「材質名」「質量(重量)」をゲットする
4. Excelを起動(または連携)し、取得したデータを表形式で綺麗に流し込む
特に、サブアセンブリ(アセンブリの中にアセンブリが入っている構造)がある場合でも、すべての末端パーツを漏れなく拾うための「再帰処理」の考え方が、実務では非常に重要になります。今回はその核心もコードに組み込んでいます。
—
実務でそのまま使える!最強自動化マクロコード
以下のコードを、SolidWorksのVBAエディタ([ツール] > [マクロ] > [新規作成])にそのまま貼り付けてください。
※事前にExcelへの参照設定(Microsoft Excel XX.X Object Library)を行っておくとスムーズですが、今回は汎用性の高い「遅延バインディング(CreateObject)」を採用しているため、設定なしでも動きます!
Option Explicit
‘ メイン処理:アセンブリの質量・材質を一括取得してExcelに出力
Sub ExportAssemblyMassReport()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swAssDoc As SldWorks.AssemblyDoc
‘ 1. SolidWorksアプリケーションの取得
Set swApp = Application.SldWorks
If swApp Is Nothing Then Exit Sub
Set swModel = swApp.ActiveDoc
If swModel Is Nothing Then
MsgBox “アクティブなドキュメントがありません。”, vbCritical, “エラー”
Exit Sub
End If
‘ アクティブドキュメントがアセンブリかチェック
If swModel.GetType <> swDocASSEMBLY Then
MsgBox “このマクロはアセンブリドキュメントでのみ実行可能です。”, vbExclamation, “確認”
Exit Sub
End If
Set swAssDoc = swModel
‘ 2. 出力用データの準備(動的配列)
‘ 配列のサイズ:(項目数, 要素数) -> 1次元: 0(名前), 1(材質), 2(重量[g]), 2次元: インデックス
Dim reportData() As Variant
Dim dataCount As Long
dataCount = 0
‘ 進行状況をステータスバーに表示
swApp.SendMsgToUser2 “質量・材質データの収集を開始します…”, swMbInformation, swMbOk
‘ 3. トップレベルコンポーネントから再帰的に走査開始
Dim swRootComp As SldWorks.Component2
Set swRootComp = swAssDoc.GetRootComponent3(True)
If Not swRootComp Is Nothing Then
Call TraverseComponent(swRootComp, reportData, dataCount)
End If
If dataCount = 0 Then
MsgBox “有効なコンポーネントが見つかりませんでした。”, vbExclamation, “確認”
Exit Sub
End If
‘ 4. Excelへの出力処理
Call OutputToExcel(reportData, dataCount)
swApp.SendMsgToUser2 “レポートの出力が完了しました!”, swMbInformation, swMbOk
End Sub
‘ 再帰的にアセンブリ構造を掘り下げる関数
Sub TraverseComponent(swComp As SldWorks.Component2, ByRef dataArr() As Variant, ByRef count As Long)
Dim vChildComps As Variant
Dim i As Long
Dim swChildComp As SldWorks.Component2
Dim swChildModel As SldWorks.ModelDoc2
vChildComps = swComp.GetChildren
If IsEmpty(vChildComps) Then Exit Sub
For i = LBound(vChildComps) To UBound(vChildComps)
Set swChildComp = vChildComps(i)
‘ 非表示(消去)コンポーネントや軽量状態の考慮
If Not swChildComp.IsSuppressed Then
Set swChildModel = swChildComp.GetModelDoc2()
If Not swChildModel Is Nothing Then
Dim compName As String
Dim materialName As String
Dim mass As Double
compName = swChildComp.Name2
‘ 材質名の取得(パーツドキュメントから取得)
materialName = GetMaterialName(swChildModel)
‘ 質量(重量)の取得 [kg]を[g]に換算する場合などはここで調整
mass = GetMassProperties(swChildModel)
‘ 配列のサイズを拡張してデータを格納
ReDim Preserve dataArr(2, count)
dataArr(0, count) = compName
dataArr(1, count) = materialName
dataArr(2, count) = mass
count = count + 1
‘ さらに子階層がある場合は再帰呼び出し
Call TraverseComponent(swChildComp, dataArr, count)
End If
End If
Next i
End Sub
‘ パーツから材質名を取得する関数
Function GetMaterialName(swModel As SldWorks.ModelDoc2) As String
Dim swPart As SldWorks.PartDoc
Dim matName As String
Dim dbName As String
matName = “”
If swModel.GetType = swDocPART Then
Set swPart = swModel
matName = swPart.GetMaterialName(dbName)
If matName = “” Then
matName = “(未設定)”
Else
matName = matName & ” (” & dbName & “)”
End If
Else
matName = “(アセンブリ)”
End If
GetMaterialName = matName
End Function
‘ 質量特性を取得する関数
Function GetMassProperties(swModel As SldWorks.ModelDoc2) As Double
Dim swMassProp As SldWorks.MassProperty
Set swMassProp = swModel.Extension.CreateMassProperty()
If Not swMassProp Is Nothing Then
‘ 単位系(ドキュメント設定依存:通常はkg等)
‘ 必要に応じて単位変換を行ってください
GetMassProperties = swMassProp.Mass
Else
GetMassProperties = 0#
End If
End Function
‘ Excelを起動し、綺麗に装飾された品質レポートを出力するプロシージャ
Sub OutputToExcel(dataArr() As Variant, totalCount As Long)
Dim xlApp As Object
Dim xlWb As Object
Dim xlWs As Object
Dim j As Long
‘ Excelのインスタンスを生成
Set xlApp = CreateObject(“Excel.Application”)
xlApp.Visible = True ‘ 処理過程を見せるため表示
Set xlWb = xlApp.Workbooks.Add
Set xlWs = xlWb.Sheets(1)
xlWs.Name = “重量配分チェックシート”
‘ — ヘッダーの作成 —
With xlWs
.Range(“A1”).Value = “SolidWorks アセンブリ 質量・材質検証レポート”
.Range(“A1”).Font.Size = 16
.Range(“A1”).Font.Bold = True
.Range(“A3”).Value = “No.”
.Range(“B3”).Value = “コンポーネント名”
.Range(“C3”).Value = “材質”
.Range(“D3”).Value = “質量 (kg)”
‘ ヘッダーの装飾(ダークブルー背景、白抜き文字)
With .Range(“A3:D3”)
.Interior.Color = RGB(31, 78, 121)
.Font.Color = RGB(255, 255, 255)
.Font.Bold = True
.HorizontalAlignment = -4108 ‘ 中央揃え
End With
‘ — データの流し込み —
Dim outRow As Long
Dim totalMass As Double
totalMass = 0#
For j = 0 To totalCount – 1
outRow = j + 4
.Cells(outRow, 1).Value = j + 1
.Cells(outRow, 2).Value = dataArr(0, j)
.Cells(outRow, 3).Value = dataArr(1, j)
.Cells(outRow, 4).Value = dataArr(2, j)
‘ 数値列の書式設定
.Cells(outRow, 4).NumberFormat = “#,
0.000″
totalMass = totalMass + dataArr(2, j)
Next j
‘ — 合計行の作成 —
Dim lastRow As Long
lastRow = totalCount + 3
.Cells(lastRow + 1, 3).Value = “総重量合計:”
.Cells(lastRow + 1, 3).Font.Bold = True
.Cells(lastRow + 1, 3).HorizontalAlignment = -4152 ‘ 右揃え
.Cells(lastRow + 1, 4).Value = totalMass
.Cells(lastRow + 1, 4).Font.Bold = True
.Cells(lastRow + 1, 4).NumberFormat = “#,
0.000″
‘ 罫線の設定
With .Range(“A3:D” & (lastRow + 1))
.Borders.LineStyle = 1 ‘ 連続線
End With
‘ 列幅の自動調整
.Columns(“A:D”).AutoFit
End With
MsgBox “Excelレポートの生成に成功しました!”, vbInformation, “完了”
End Sub
—
ここをクリアすればバッチリ!実務でハマりやすい罠と対策
このコードを動かすにあたり、SolidWorks API特有の「つまずきポイント」をいくつかクリアしています。エンジニアとして知っておくべき重要事項を解説します。
1. 軽量コンポーネント(Lightweight)の呪縛
SolidWorksは大規模アセンブリを開くとき、メモリを節約するためにパーツを「軽量状態」で読み込みます。軽量状態のままだと、正確な質量特性や材質データが取得できないことがあります。
今回のコードでは、`swChildComp.GetModelDoc2()` を呼び出すことで、必要に応じて自動的に完全解決(Resolve)させながらデータを安全に引き抜く設計にしています。
2. 再帰処理(Recursive)による無限の階層対応
「アセンブリの中にアセンブリ(サブアセンブリ)があり、その中にさらにパーツがある」というツリー構造は、通常の `For` ループだけでは網羅できません。
関数 `TraverseComponent` の中で自分自身を再度呼び出す「再帰関数」を使うことで、何階層の複雑なアセンブリであっても、もれなく全ての末端パーツを拾い上げることができます。ここが書ければ、アセンブリ操作系マクロのマスターと言えます!
—
まとめ:自動化の第一歩は「自分の手作業をコードに翻訳すること」から
今回は、アセンブリから材質と質量を一括取得し、美しいExcelレポートを出力する実務プログラムを作成しました。
「毎日30分かかっていた重量チェック表の作成が、ボタン一つで3秒で終わるようになった」
そんな感動を味わっていただけたなら、エンジニアとしてこれ以上の喜びはありません。
ここをクリアしたあなたなら、次は「特定の材質のパーツだけの色を変える」「指定重量を超えたらアラートを出す」といった発展的なカスタマイズも自由自在です。
SolidWorks VBAの世界は奥が深いですが、一歩ずつ確実に進めば、あなたの設計業務は劇的にスマートになります。
それでは、次の自動化の旅でお会いしましょう!バッチリ使いこなしてくださいね!
