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

スポンサーリンク

SolidWorks自動化の真髄:Excel BOMからアセンブリを「構造化」して再構築する極限の技術

設計現場における「BOM(部品表)からのアセンブリ自動構築」は、多くのエンジニアが挑み、そして多くがメモリリークと不安定なCOMオブジェクトの海に沈んでいく難所だ。

君たちが今から書こうとしているのは、単なるVBAスクリプトではない。これは、CADの内部構造(Component Tree)を外部データで制御するという、極めて高度な「メタプログラミング」の入り口だ。今日は、安定性を犠牲にしない、シニアエンジニアのための「堅牢な自動構築アーキテクチャ」を伝授する。

1. 鬼門を突破する:COMオブジェクトのライフサイクル管理

まず大前提として、SolidWorks APIを扱う際、VBAの「自動ガベージコレクション」を信じてはならない。特にExcelからSolidWorksを操作する場合、`Set swApp = Nothing` だけでは不十分だ。

メモリを汚さないための定石

  • 明示的な解放: `Set swComp = Nothing`, `Set swModel = Nothing` を徹底せよ。
  • 循環参照の回避: ループ内でのオブジェクト生成は、必ずスコープを絞り、参照カウントを意識する。
  • エラーハンドラ: `On Error GoTo` を使わないコードは、現場では「動作確認」すら許されない。

2. 実装:Excel BOM to Assembly 自動構築エンジン

以下のコードは、Excelの行を走査し、SolidWorksの`AddComponent6`を叩いてツリーを組むためのコア・ロジックである。

‘ ———————————————————
‘ SolidWorks Assembly Builder Engine
‘ 外部BOMからアセンブリを構成するコアモジュール
‘ ———————————————————
Option Explicit

Public Sub BuildAssemblyFromBOM()
Dim swApp As SldWorks.SldWorks
Dim swAssy As SldWorks.AssemblyDoc
Dim swModel As SldWorks.ModelDoc2
Dim row As Long
Dim filePath As String, compName As String

‘ SolidWorksへの接続 (遅延バインディング推奨)
Set swApp = GetObject(, “SldWorks.Application”)
Set swModel = swApp.ActiveDoc

If swModel.GetType <> swDocASSEMBLY Then
MsgBox “アクティブなドキュメントがアセンブリではありません。”, vbCritical
Exit Sub
End If

Set swAssy = swModel

‘ Excelシートから行を読み込み(ActiveSheet前提)
For row = 2 To ActiveSheet.UsedRange.Rows.Count
filePath = Cells(row, 1).Value ‘ 部品パス

‘ コンポーネントの追加
‘ ComponentAddOptionsは必要に応じてビット演算で指定
Dim swComp As SldWorks.Component2
Set swComp = swAssy.AddComponent6(filePath, _
swAddComponentConfigOptions_CurrentSelectedConfig, _
“”, False, “”, 0, 0, 0)

If swComp Is Nothing Then
Debug.Print “Failed to add: ” & filePath
End If

‘ コンポーネントの解放
Set swComp = Nothing
Next row

‘ クリーンアップ
Set swAssy = Nothing
Set swModel = Nothing
Set swApp = Nothing
End Sub

3. シニアエンジニアが意識すべき「隠れた地雷」

パス解決とWindows API

外部ファイルパスがネットワークドライブや長いパス名(260文字制限)の場合、`AddComponent`は容赦なく失敗する。Windows APIの `GetLongPathName` を呼び出し、フルパスを正規化するプロセスを前段に組み込むのは、プロとしての最低限の防衛線だ。

再構築(Rebuild)のタイミング

ループ内で毎回 `swModel.ForceRebuild3` を呼ぶのは、処理時間を指数関数的に増大させる。アセンブリの構築は「追加」をすべて完了させた後に、一度だけ `EditRebuild3` を叩くのが鉄則だ。

4. レガシー環境との対話:システム間連携の思想

もし、君たちが扱うデータがPDM(Product Data Management)と連携しているなら、単純なファイルパス指定では不十分だ。

  • メタデータ同期: `swComp.CustomPropertyManager` を使い、Excel側の属性(材料、重量、管理番号)を、読み込みと同時にパーツのカスタムプロパティに流し込む実装を加えるべきだ。
  • ログ出力: どのファイルが読み込めなかったか、どの位置でタイムアウトしたかをCSV等で残すこと。システム管理者が後から追跡できないツールは、現場では「ただのブラックボックス」として嫌われる。

最後に:職人としての心得

SolidWorks APIは、強力だが冷酷だ。君たちが書く数行のコードが、設計者の数時間分の作業を救うこともあれば、CAD環境そのものをクラッシュさせる原因にもなる。

「動いたからOK」というジュニアの思考から脱却せよ。エラーが発生した時に、どのオブジェクトがメモリを握ったまま離さなかったかを瞬時に推測できるレベルまで、オブジェクトモデルを身体に叩き込むこと。

君たちが記述するコードが、次世代の設計自動化の礎となることを期待している。健闘を祈る。

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