【入門編】【実務中級】Excel部品表(BOM)のデータを読み込み、対応するSolidWorksアセンブリを自動構築する – SolidWorks VBA解析バイブル

スポンサーリンク

Excel BOMからSolidWorksアセンブリを自動構築する極限のVBAガイド

こんにちは!日々の設計業務、本当にお疲れ様です。

「毎日、Excelの部品表(BOM)を見ながら、手作業でパーツをアセンブリに挿入して、座標を合わせて、合致を付ける……この不毛な作業、なんとかならないのか?」

そう思ったことはありませんか?
マクロの記録を卒業し、一歩進んだ「実務で本当に使える自動化」を目指すあなたへ。今回は、Excelの構成リストを読み込み、SolidWorks上にアセンブリを自動で組み立てるマクロの作成に挑戦します。

一見難しそうに見えますが、3D CADのAPIが持つ特徴(作法)さえ押さえれば、誰でも美しい自動化ツールが作れるようになります。「ここをクリアすれば、SolidWorks VBAの基本はバッチリですよ」というポイントを、優しく、かつエンジニアとしての深い視点から解説していきますね。

一緒にステップアップしていきましょう!

—

1. 全体像:ExcelとSolidWorksの架け橋を作る

今回のシステムの仕組みは非常にシンプルです。

1. Excelシート(BOM)に、挿入したい部品の「ファイルパス」「配置座標(X, Y, Z)」「回転角度」を記述しておく。
2. SolidWorks VBAがExcelのデータを1行ずつ読み込む。
3. SolidWorks上に新規アセンブリを作成し、指定された部品を自動でロード・配置する。

[ Excel BOM (部品表) ]
|– 部品A.sldprt (X:100, Y:0, Z:0)
|– 部品B.sldprt (X:200, Y:50, Z:0)
v
[ SolidWorks VBA マクロ ]
v
[ SolidWorks 3D空間 ] (自動でパーツが挿入・配置される!)

なぜ「手作業」から脱却する必要があるのか?

手作業でのインポートは、クリックミスや入力ミスの温床です。また、100点を超える部品を扱う場合、アセンブリの構築だけで半日が終わってしまいます。
この処理をプログラムに委ねることで、作業時間は一瞬(数秒〜数分)になり、人為的ミスはゼロになります。

—

2. 準備:Excel BOMのレイアウト設計

まずは、読み込むExcelシートのレイアウトを決めましょう。Excelの「Sheet1」に以下のようなデータを用意します。

| A列: PartPath (部品のフルパス) | B列: X (mm) | C列: Y (mm) | D列: Z (mm) | E列: Angle (度) |
| :— | :— | :— | :— | :— |
| `C:\CAD_Data\BasePlate.sldprt` | 0 | 0 | 0 | 0 |
| `C:\CAD_Data\Bracket.sldprt` | 150 | 50 | 0 | 90 |
| `C:\CAD_Data\Sensor.sldprt` | 150 | 120 | 25 | 0 |

> 💡 先輩のアドバイス:単位の罠に注意!
> SolidWorks APIの内部単位は「メートル(m)」および「ラジアン(rad)」です。
> Excel側で使いやすい「ミリメートル(mm)」や「度(deg)」で数値を入力した場合、VBAの内部で 1000で割る(m換算)、` Pi / 180` する(ラジアン換算) という変換処理が必須になります。これを忘れると、部品が宇宙の彼方に飛んでいってしまいます!

—

3. 【完全版】アセンブリ自動構築VBAソースコード

それでは、実際に動くコードを見てみましょう。
SolidWorksのVBAエディタ(Alt + F11)を開き、新しい標準モジュールを追加して以下のコードを貼り付けてください。

※実行する前に、Excelへの参照設定(`Microsoft Excel 16.0 Object Library` 等)を有効にするか、以下のコードのように「レイトバインディング(CreateObject)」を使用することで、参照設定なしでも動作するように設計しています。

Option Explicit

‘ —————————————————————————–
‘ ■ Excel BOMからSolidWorksアセンブリを自動構築するメインマクロ
‘ —————————————————————————–
Sub BuildAssemblyFromExcel()
‘ SolidWorksオブジェクト用変数
Dim swApp As SldWorks.SldWorks
Dim swAssy As SldWorks.AssemblyDoc
Dim swModel As SldWorks.ModelDoc2
Dim swConfMgr As SldWorks.ConfigurationManager
Dim swConf As SldWorks.Configuration
Dim swRootComp As SldWorks.Component2
Dim swComp As SldWorks.Component2
Dim swMathUtil As SldWorks.MathUtility

‘ Excelオブジェクト用変数
Dim xlApp As Object
Dim xlBook As Object
Dim xlSheet As Object

‘ 各種設定用
Dim excelPath As String
Dim partPath As String
Dim posX As Double, posY As Double, posZ As Double
Dim rotAngle As Double
Dim row As Long
Dim lastRow As Long
Dim errors As Long
Dim warnings As Long

‘ 1. SolidWorksのインスタンスを取得
Set swApp = Application.SldWorks
Set swMathUtil = swApp.GetMathUtility

‘ 2. 新規アセンブリドキュメントを作成
‘ ※デフォルトのアセンブリテンプレートを使用します
Dim defaultTemplate As String
defaultTemplate = swApp.GetUserPreferenceStringValue(swUserPreferenceStringValue_e.swDefaultTemplateAssembly)

If defaultTemplate = “” Then
MsgBox “デフォルトのアセンブリテンプレートが見つかりません。設定を確認してください。”, vbCritical
Exit Sub
End If

Set swModel = swApp.NewDocument(defaultTemplate, 0, 0, 0)
If swModel Is Nothing Then
MsgBox “新規アセンブリの作成に失敗しました。”, vbCritical
Exit Sub
End If

Set swAssy = swModel

‘ 3. Excelファイルを選択させる(ユーザーフレンドリーな設計)
excelPath = swApp.GetOpenFileName(“Excel部品表の選択”, “”, “Excel Files (.xlsx; .xls),.xlsx;.xls”, errors, warnings, “”)
If excelPath = “” Then
MsgBox “処理がキャンセルされました。”, vbInformation
Exit Sub
End If

‘ 4. バックグラウンドでExcelを起動
On Error Resume Next
Set xlApp = CreateObject(“Excel.Application”)
On Error GoTo 0

If xlApp Is Nothing Then
MsgBox “Excelを起動できませんでした。”, vbCritical
Exit Sub
End If

xlApp.Visible = False ‘ 画面非表示で高速化
Set xlBook = xlApp.Workbooks.Open(excelPath)
Set xlSheet = xlBook.Sheets(1) ‘ 1番目のシートを対象とする

‘ Excelの最終行を取得
lastRow = xlSheet.Cells(xlSheet.Rows.Count, “A”).End(-4162).Row ‘ -4162 = xlUp

‘ 5. Excelの行をループして部品を配置
‘ ※1行目はヘッダーと仮定し、2行目からスタート
For row = 2 To lastRow
partPath = xlSheet.Cells(row, 1).Value

‘ ファイルパスが空の場合はスキップ
If partPath <> “” Then
‘ ミリメートル(mm)からメートル(m)へ変換
posX = xlSheet.Cells(row, 2).Value / 1000#
posY = xlSheet.Cells(row, 3).Value / 1000#
posZ = xlSheet.Cells(row, 4).Value / 1000#
‘ 角度(deg)からラジアン(rad)へ変換
rotAngle = xlSheet.Cells(row, 5).Value (3.14159265358979 / 180#)

‘ SolidWorks空間にコンポーネントを追加
Set swComp = AddComponentToAssembly(swAssy, partPath, posX, posY, posZ, rotAngle, swMathUtil)

If swComp Is Nothing Then
swApp.SendMsgToUser2 “部品の追加に失敗しました: ” & partPath, swMessageBoxIcon_e.swMbWarning, swMessageBoxBtn_e.swMbOk
End If
End If
Next row

‘ 6. 後処理:Excelを安全に閉じる
xlBook.Close SaveChanges:=False
xlApp.Quit

‘ メモリ解放
Set xlSheet = Nothing
Set xlBook = Nothing
Set xlApp = Nothing

‘ アセンブリ全体の再構築とビューの最適化
swModel.ForceRebuild3 True
swModel.ViewZoomtofit2

MsgBox “アセンブリの自動構築が完了しました!”, vbInformation, “成功”
End Sub

‘ —————————————————————————–
‘ ■ サブ関数:コンポーネントをアセンブリに追加し、位置と回転を設定する
‘ —————————————————————————–
Function AddComponentToAssembly( _
ByRef swAssy As SldWorks.AssemblyDoc, _
ByVal partPath As String, _
ByVal x As Double, _
ByVal y As Double, _
ByVal z As Double, _
ByVal angleRad As Double, _
ByRef swMathUtil As SldWorks.MathUtility) As SldWorks.Component2

On Error GoTo ErrorHandler

Dim swModel As SldWorks.ModelDoc2
Set swModel = swAssy

‘ 1. アセンブリにコンポーネントを追加 (AddComponent5を使用)
‘ ※最新のAPIを使用することで、ロードの安定性が向上します
Dim swComp As SldWorks.Component2
Set swComp = swAssy.AddComponent5(partPath, swAddComponentConfigOptions_e.swAddComponentConfigOptions_CurrentSelected, “”, False, “”, x, y, z)

If swComp Is Nothing Then
Set AddComponentToAssembly = Nothing
Exit Function
End If

‘ 2. 回転行列(Transform)の作成と適用
‘ Y軸を中心とした回転を例に挙げています
Dim transformData(15) As Double

‘ 3×3の回転行列 (Y軸回転)
transformData(0) = Cos(angleRad): transformData(1) = 0: transformData(2) = -Sin(angleRad)
transformData(3) = 0: transformData(4) = 1: transformData(5) = 0
transformData(6) = Sin(angleRad): transformData(7) = 0: transformData(8) = Cos(angleRad)

‘ 翻訳ベクトル (位置情報)
transformData(9) = x
transformData(10) = y
transformData(11) = z

‘ スケーリング (常に 1.0)
transformData(12) = 1.0

‘ 不要なデータをクリア
transformData(13) = 0: transformData(14) = 0: transformData(15) = 0

‘ MathTransformオブジェクトの生成とコンポーネントへの適用
Dim swTransform As SldWorks.MathTransform
Set swTransform = swMathUtil.CreateTransform(transformData)

‘ コンポーネントの配置情報を更新
swComp.Transform2 = swTransform

‘ 変更を適用
Set AddComponentToAssembly = swComp
Exit Function

ErrorHandler:
Set AddComponentToAssembly = Nothing
End Function

—

4. ディープダイブ:プロが実践する「落とし穴」回避術

ソースコードをコピペして動かすだけでも感動的ですが、ここからが「マクロの記録」を脱出したエンジニアに必要な「本質の理解」です。SolidWorks VBAで挫折しやすい4つの落とし穴と、その解決策を解説します。

落とし穴1:なぜ `AddComponent5` を使うのか?

古いサンプルコードでは `AddComponent4` や、単にパーツを開いてからコピペする手法(`AddComponents`)が使われていることがあります。
しかし、実務においては `AddComponent5` を強く推奨します。

  • 理由: `AddComponent5` は、パーツをメモリ上にロードせずに「サイレント」にアセンブリに追加できます。また、追加時の座標系を直接指定できるため、大規模アセンブリでのパフォーマンスが劇的に向上します。

落とし穴2:3D空間の回転を制御する「変換行列(Transform)」

「部品を少し回転させて配置したい」という要望は実務で必ず発生します。
SolidWorksにおいて、部品の位置と回転は `MathTransform`(変換行列) という16個の要素を持つ配列で管理されています。

[ R00 R01 R02 ] <- 回転要素 (3x3行列) [ R10 R11 R12 ] [ R20 R21 R22 ] [ TX TY TZ ] <- 並行移動(位置)要素 [ Scale ] <- スケール (通常は1.0) 上記のコードでは、Y軸周りの回転行列を数式(`Cos` や `Sin`)で定義し、そこに位置情報を結合して1つの `MathTransform` オブジェクトを作成しています。 これを理解しておくと、斜めに配置された部品や、複雑な傾きを持つパーツも一発で制御できるようになります。

落とし穴3:自動合致(Mate)の罠を回避する

「自動配置だけでなく、合致(Mate)も自動で付けたい!」と思うのは自然な流れです。
しかし、APIによる合致の自動化(`AddMate5` など)は、実は非常にデリケートで失敗しやすい領域です。

  • 失敗する理由: 合致を定義するには、部品同士の「面」や「エッジ」を一意に選択(`SelectByID2`)する必要があります。しかし、インポートした部品の面の名前(例: `Face1`)は、形状変更や保存の過程で簡単に変わってしまいます。
  • プロの解決策:

1. 「座標系合致」の活用: 部品側とアセンブリ側に共通の「基準座標系(Coordinate System)」を作成しておき、座標系同士を合致させる。これなら面選択の不確定要素を完全に排除できます。
2. 簡易配置に留める: 本マクロのように、座標と回転だけで「正しい位置に置いてあげる」ところまでを自動化し、最後の細かい合致は設計者が手動で行う。これだけでも作業の9割は削減されます。

落とし穴4:消えないExcelプロセス(メモリリーク)

VBAマクロが途中でエラー終了したり、オブジェクトの解放を怠ると、タスクマネージャーに `EXCEL.EXE` がゴーストプロセスとして残り続けます。これが溜まるとパソコンの動作が極端に重くなります。

コードの最後にある、以下のクリーンアップ処理は絶対に省略しないでください。

xlBook.Close SaveChanges:=False
xlApp.Quit
Set xlSheet = Nothing
Set xlBook = Nothing
Set xlApp = Nothing

万が一途中でエラーが起きても必ずここを通るように、エラーハンドリング(`On Error GoTo`)を設計することが、プロレベルの堅牢なコードへの第一歩です。

—

5. まとめと次のステップ

お疲れ様でした!
今回作成したマクロをマスターすれば、以下のような応用も簡単にできるようになります。

  • Excelに「構成数(個数)」の列を増やし、ループ処理で同じ部品を複数個並べる。
  • 配置する部品の「コンフィギュレーション名」をExcelで指定し、異なるサイズを自動で出し分ける。

最初は難しく見えた3D CADの座標制御も、一度コードを動かしてパーツがピタッと定位置に収まる瞬間を見れば、「これならできる!」という確信に変わるはずです。

「ここをクリアすれば、SolidWorks VBAの基本はバッチリですよ。」

あなたの設計業務が劇的に効率化され、よりクリエイティブな設計作業に集中できる時間が増えることを心から応援しています。分からないことがあれば、いつでもコードに戻って、一つ一つの変数の動きを追いかけてみてくださいね。

また次の記事でお会いしましょう。ハッピー・コーディング!

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