【SolidWorks VBA極限活用】InterferenceDetectionMgrが生むアセンブリ干渉チェックの自動化とExcelレポート生成の極意
SolidWorksのアセンブリ設計において、最大の悪夢は「干渉(Interference)」を見逃したまま製造工程へ進むことだ。数千点に及ぶ部品が入り組む巨大なアセンブリにおいて、目視や手動での干渉チェックはヒューマンエラーの温床となる。
今回は、SolidWorks APIの `InterferenceDetectionMgr` を極限まで使い倒し、アセンブリ内の干渉・隙間をプログラムから網羅的に検出し、ワンクリックでExcelへ美しく構造化されたレポートとして出力する実用マクロを解説する。
単なるAPIのラッパーではない。メモリ管理、COMオブジェクトのライフサイクル、そして実務で耐えうる堅牢性を備えたコードベースをここに提示する。
—
1. InterferenceDetectionMgr アーキテクチャの核心
`ModelDoc2::Extension::CreateInterferenceDetectionMgr` から取得される `InterferenceDetectionMgr` は、SolidWorksのバックエンドでC++の重厚な幾何学演算エンジン(Parasolid)を直接叩く高負荷なオブジェクトである。
シニアエンジニアとして知っておくべき「APIの裏側の挙動」は以下の3点だ。
1. メモリリークの温床: 干渉検出の結果生成されるインターフェースオブジェクト群(干渉ボリュームのBodyなど)は、VBAのガベージコレクションに任せるとメモリリークやSolidWorks自体の強制終了(クラッシュ)を引き起こす。明示的な `Set obj = Nothing` が必須。
2. パフォーマンスの罠: すべての部品同士を総当たりで計算すると $O(N^2)$ のオーダーで処理が爆発する。非表示部品(Suppressed / Hidden)をあらかじめ計算対象から除外するチューニングが不可欠。
3. Excel連携のI/Oコスト: 検出結果のループ内で毎回Excelのセルを書き換えると、COMのコンテキストスイッチが発生し極端に遅くなる。必ず2次元配列(Variant Array)にデータをメモリ上で構築し、一括転送(Bulk Transfer)する。
—
2. 実装コード:干渉自動検出 & Excelレポート出力マクロ
以下のコードは、アクティブなアセンブリドキュメントを走査し、干渉部品のペア、干渉容積(Volume)、および交差するソリッド情報を抽出してExcelへ出力する、現場即応型の完全版VBAマクロである。
Option Explicit
‘ ==============================================================================
‘ 担当: チーフアーキテクト
‘ 概要: アセンブリ干渉チェックの自動化とExcelレポート生成
‘ 備考: 64bit SolidWorks / Excel 2016以降推奨
‘ ==============================================================================
Sub Main()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swAssy As SldWorks.AssemblyDoc
Dim swIntMgr As SldWorks.InterferenceDetectionMgr
‘ 1. アプリケーションコンテキストの取得
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 “アクティブなドキュメントがアセンブリではありません。”, vbCritical, “エラー”
Exit Sub
End If
Set swAssy = swModel
‘ 2. 干渉マネージャーの初期化
Set swIntMgr = swModel.Extension.CreateInterferenceDetectionMgr()
If swIntMgr is Nothing Then
MsgBox “干渉検出マネージャーの生成に失敗しました。”, vbCritical, “致命的エラー”
Exit Sub
End If
With swIntMgr
.TreatCoincidenceAsInterference = False ‘ 面接触は干渉とみなさない
.IncludeSubAssemblies = True ‘ サブアセンブリ内も再帰的にチェック
.IgnoreHiddenBodies = True ‘ 非表示ボディは無視して高速化
.MakeInterferenceParts = False ‘ 干渉部分の合体部品は作成しない(メモリ保護)
.LoopCheck = True ‘ 貫通・ループチェック有効
End With
‘ 3. 干渉計算の実行(重い処理のためステータスバーに表示)
swApp.SendMsgToUser2 “干渉計算を実行中です。しばらくお待ちください…”, 0, 0
Dim vInterferences As Variant
vInterferences = swIntMgr.GetInterferences()
‘ マネージャーの解放(重要:メモリ解放の第一歩)
swModel.Extension.DestroyInterferenceDetectionMgr
Set swIntMgr = Nothing
If IsEmpty(vInterferences) Then
MsgBox “干渉は検出されませんでした。設計は正常です。”, vbInformation, “結果”
Exit Sub
End If
Dim interferenceCount As Long
interferenceCount = UBound(vInterferences) – LBound(vInterferences) + 1
‘ 4. データを格納する2次元配列の定義 (高速化の肝)
‘ 構造: [行, 0:No / 1:部品A / 2:部品B / 3:干渉体積(mm3)]
ReDim reportData(1 To interferenceCount, 1 to 4) As Variant
Dim i As Long
Dim swInterference As SldWorks.Interference
Dim compA As SldWorks.Component2
Dim compB As SldWorks.Component2
For i = 0 To interferenceCount – 1
Set swInterference = vInterferences(i)
‘ 構成部品の取得
Set compA = swInterference.GetComponent1()
Set compB = swInterference.GetComponent2()
reportData(i + 1, 1) = i + 1
reportData(i + 1, 2) = IIf(compA Is Nothing, “不明”, compA.Name2)
reportData(i + 1, 3) = IIf(compB Is Nothing, “不明”, compB.Name2)
reportData(i + 1, 4) = swInterference.Volume 1000000000# ‘ m3 から mm3へ換算
‘ ループ内でのCOMオブジェクト参照の確実な破棄
Set swInterference = Nothing
Set compA = Nothing
Set compB = Nothing
Next i
‘ 5. Excelへの一括出力処理
Call ExportToExcel(reportData, interferenceCount)
MsgBox “干渉レポートの生成が完了しました。” & vbCrLf & “検出件数: ” & interferenceCount & “件”, vbInformation, “完了”
End Sub
Private Sub ExportToExcel(ByRef dataArray() As Variant, ByVal totalCount As Long)
Dim xlApp As Object
Dim xlWb As Object
Dim xlWs As Object
‘ Excelインスタンスの遅延バインディング生成
On Error Resume Next
Set xlApp = CreateObject(“Excel.Application”)
On Error GoTo 0
If xlApp Is Nothing Then
MsgBox “Excelの起動に失敗しました。”, vbCritical, “Excelエラー”
Exit Sub
End If
xlApp.Visible = True
Set xlWb = xlApp.Workbooks.Add
Set xlWs = xlWb.Sheets(1)
xlWs.Name = “干渉チェックレポート”
‘ ヘッダーの設定
Dim headers As Variant
headers = Array(“No.”, “部品 A”, “部品 B”, “干渉体積 (mm³)”)
xlWs.Range(“A1:D1”).Value = headers
‘ ヘッダーの装飾
With xlWs.Range(“A1:D10”)
.Font.Name = “Meiryo UI”
End With
With xlWs.Range(“A1:D1”)
.Interior.Color = RGB(41, 128, 185)
.Font.Color = RGB(255, 255, 255)
.Font.Bold = True
.HorizontalAlignment = -4108 ‘ 中央揃え
End With
‘ データの二次元配列を一括転送(極限のI/O最適化)
Dim targetRange As Object
Set targetRange = xlWs.Range(“A2”).Resize(totalCount, 4)
targetRange.Value = dataArray
‘ テーブルの枠線と数値フォーマット適用
With targetRange
.Borders.LineStyle = 1 ‘ Continuous
.Borders.Weight = 2 ‘ Thin
End With
xlWs.Range(“D2:D” & (totalCount + 1)).NumberFormat = “#,
0.00″
xlWs.Columns.AutoFit
‘ オブジェクトの解放
Set targetRange = Nothing
Set xlWs = Nothing
Set xlWb = Nothing
Set xlApp = Nothing
End Sub
—
3. チーフアーキテクトが解説するコードの急所
① `DestroyInterferenceDetectionMgr` の絶対性
SolidWorks APIでは、カスタムマネージャーやセレクションリスト等の特殊な管理オブジェクトを作成した際、明示的に破棄メソッドを呼ばないとメモリリークを起こす。
特に `CreateInterferenceDetectionMgr` は内部に重い幾何学キャッシュを保持するため、計算が終わったら直ちに `swModel.Extension.DestroyInterferenceDetectionMgr` を叩くこと。これを怠ると、巨大アセンブリを何回かチェックしただけでSolidWorksがメモリ不足で落ちるようになる。
② 遅延バインディング(Late Binding)によるExcel操作
実務において、クライアントPCのExcelのバージョン(Office 365, 2019, 2021など)はバラバラである。型ライブラリの参照設定(Early Binding)を行っていると、バージョン差異によるコンパイルエラー(型ミスマッチ)に悩まされる。
そのため、上記コードでは `CreateObject(“Excel.Application”)` による遅延バインディングを採用し、バージョン依存性を完全に排除している。
③ 2次元配列によるメモリ上でのデータ構築
VBAからExcelセルへアクセスする回数は、実行速度に致命的な影響を与える。ループ内で `Cells(i, 1).Value = …` を実行すると、その都度VBAとExcelの間でCOMプロセスのコンテキストスイッチが発生し、数千件のデータ処理で数分を要する。
配列 `reportData` にすべてのデータをインメモリで蓄え、`targetRange.Value = dataArray` で1回だけ一括転送することで、処理時間をコンマ数秒レベルにまで圧縮している。
—
4. さらなる高みへ:システム間連携とバッチ処理への応用
このマクロを単なる「個人の便利ツール」で終わらせてはならない。シニアエンジニアであれば、これをPDM(Product Data Management)や社内の設計管理Webシステム、あるいは夜間バッチ(Windowsタスクスケジューラ)へと昇華させるべきだ。
- ヘッドレス実行(GUIなし): `swApp.Visible = False` と組み合わせることで、夜間にサーバー側で自動的に全アセンブリの干渉チェックを走り抜けさせ、朝出社した時には最新の干渉レポートが共有サーバーに上がっている仕組みを構築できる。
- JSON/API連携: Excel出力の代わりに、`MSXML2.DOMDocument` や VBA用のJSONライブラリを用いて、検出された干渉データを社内の製造管理システムへREST API経由で自動POSTする。
品質担保は、人の目ではなくシステム化によって成し遂げられる。
このコードをあなたの開発環境に組み込み、設計のロバスト性を極限まで高めてほしい。
