【実務・中級編】【外部データ連携】ExcelのBOM(部品表)からSolidWorksアセンブリのツリー構造を自動生成する – SolidWorks VBA解析バイブル

スポンサーリンク

SolidWorks APIの真髄:Excelからアセンブリを「構造的」に生成する極意

SolidWorks APIを扱う際、初心者は「とりあえず動くコード」を書こうとします。しかし、我々のようなエンジニアが目指すべきは、「堅牢で、拡張性が高く、そして何よりメモリリークを許さないコード」です。

今回は、Excel上のBOMリストからアセンブリを自動構築する自動化ツールを題材に、SolidWorks APIを掌握するための設計思想を伝授します。

1. なぜ「手当たり次第」に組み込んではいけないのか

多くの開発者が陥る罠は、`SldWorks`オブジェクトや`ModelDoc2`オブジェクトを闇雲に生成し、終了処理を怠ることです。SolidWorksのCOMインターフェースは非常にデリケートです。

  • コンポーネントの重複登録: 同一パーツを複数呼び出す際、パスの解決を適当に行うと、SolidWorksは「どのファイルか」を検索する無駄なプロセスを走らせます。
  • メモリの解放: オブジェクトを明示的に `Nothing` にしない、あるいは `ReleaseComObject` を意識しないコードは、長時間稼働させるとSolidWorksのパフォーマンスを確実に劣化させます。

設計の鉄則: アセンブリへの追加は `IAssemblyDoc::AddComponent5` を使い、常に「戻り値(コンポーネント)」を管理下に置くこと。

2. 堅牢な自動生成エンジン:プロダクションコード

このコードは、ExcelのA列に「ファイルフルパス」、B列に「X座標」、C列に「Y座標」、D列に「Z座標」が記載されている前提で構築します。

Option Explicit

‘ 必要なライブラリ:SolidWorks 20xx Type Library
‘ 参照設定忘れずに: SolidWorks Interop

Public Sub BuildAssemblyFromExcel()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swAssy As SldWorks.AssemblyDoc
Dim swComp As SldWorks.Component2
Dim ws As Worksheet
Dim lastRow As Long, i As Long
Dim filePath As String
Dim x As Double, y As Double, z As Double

‘ 1. インスタンスの取得(既存の起動済みプロセスに接続)
Set swApp = Application.SldWorks

‘ 2. 新規アセンブリ作成
Set swModel = swApp.NewDocument(“C:\ProgramData\SolidWorks\…\Assembly.asmdot”, 0, 0, 0)
Set swAssy = swModel

Set ws = ThisWorkbook.Sheets(“BOM”)
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

‘ 3. ループ処理:エラーハンドリングを必ず噛ませる
On Error GoTo ErrorHandler

For i = 2 To lastRow
filePath = ws.Cells(i, 1).Value
x = ws.Cells(i, 2).Value / 1000 ‘ mmからmへの変換は必須
y = ws.Cells(i, 3).Value / 1000
z = ws.Cells(i, 4).Value / 1000

‘ コンポーネント追加
Set swComp = swAssy.AddComponent5(filePath, “”, “”, False, “”, x, y, z)

If swComp Is Nothing Then
Debug.Print “Failed to load: ” & filePath
Else
‘ 必要に応じて合致(Mate)を追加するロジックをここに
End If
Next i

MsgBox “アセンブリ構築完了”
Exit Sub

ErrorHandler:
MsgBox “エラー発生: ” & Err.Description
‘ ここでオブジェクトのクリーンアップを行う
End Sub

3. 実務で勝つための「3つの極意」

① 座標系と単位系を疑え

SolidWorks APIの内部単位は「メートル(m)」です。Excel側を「ミリ(mm)」で管理している場合、必ず `1000` で割る処理をコードに組み込んでください。これを忘れると、パーツが遥か彼方に配置されることになります。

② フルパスの妥当性検証

`Dir(filePath)` 関数を使い、ファイルが存在するかどうかを事前に検証してください。ファイルが見つからないままAPIを叩くと、SolidWorksのダイアログが前面に出て、自動化プロセスがそこで停止します。「自動化プロセスを止めるダイアログ」はエンジニアの敵です。

③ 履歴管理と再実行性

一度実行したアセンブリを再度実行する場合、既存のモデルをどう扱うか決めていますか?

  • 既存ファイルを開くのか?
  • 新しい名前で保存するのか?
  • 一度すべて消去するのか?

これらを「設定ファイル」で切り替えられるようにしておくと、保守性が飛躍的に向上します。

結論:コードは「資産」である

今回提示したコードは、単なるスクリプトではありません。あなたの業務を拡張し、手作業によるミスを排除するための「資産」です。

SolidWorks APIを扱う際は、常に「SolidWorksがこの操作をどう受け取り、どうメモリを消費するか」を想像してください。その想像力が、あなたをただのプログラマーから、業務自動化のアーキテクトへと変貌させます。

何か行き詰まったら、まずはAPIヘルプ(`swconst.bas`)を読み込み、戻り値のステータスコードを一つ一つ確認する癖をつけてください。近道はありませんが、その積み重ねが、誰にも真似できない最強の自動化ツールを生み出すのです。

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