こんにちは!SolidWorksの自動化の世界へようこそ。
マクロの記録ボタンを押して出てきたコードを眺めるだけの階段は、もう登り終えましたね。ここからは、SolidWorks APIの核心に迫り、あなたの設計業務を劇的に劇変させる「本物の自動化」を手に入れましょう。
今回は、アセンブリ設計の最大の恐怖──「部品同士の干渉・ぶつかり合い」をプログラムの力で完全に暴き出し、Excelへと自動レポート化する魔術を伝授します。
ここをクリアすれば、SolidWorks VBAのオブジェクトモデルの操り方はもうバッチリです。一緒に極上のコードを組み上げていきましょう!
—
1. なぜ「InterferenceDetectionMgr」なのか?
複雑なアセンブリモデルを組み上げたとき、目視だけですべての干渉を見つけるのは、砂漠で針を探すようなものです。図面を引いて試作を作ってから「あ、干渉してる!」と気づいた時の絶望感と言ったら……想像するだけでも冷や汗が出ますよね。
SolidWorksには、手動で干渉チェックを行う機能がありますが、これをVBAから操るのが `InterferenceDetectionMgr`(干渉チェックマネージャー) です。
このオブジェクトの何がすごいかと言うと、
- アセンブリ内の全コンポーネント(または指定したサブアセンブリ)の干渉を高速スキャン
- 干渉している「体積」や「部品のペア」を正確に抽出
- 干渉部分のソリッドボディ(交差部分の体)を一時的に生成することも可能
という、設計ミスの最終防衛ラインとしてこれ以上ない能力を持っているからです。
—
2. アーキテクチャの全体像:どうやってExcelに飛ばすのか?
今回作成するマクロのフローは以下の通りです。非常にシンプルですが、APIの本質がギュッと詰まっています。
1. アクティブなアセンブリ(`ModelDoc2`)を取得する
2. アセンブリから `InterferenceDetectionMgr` を呼び出す
3. 干渉計算を実行し、ヒットしたペアのリストを取得する
4. Excelアプリケーションを裏側(または表側)で起動し、結果を綺麗に表形式で流し込む
—
3. 実装コード:現場で使える最強の干渉チェックマクロ
それでは、そのままVBAエディタ(IDE)に貼り付けて動かせる実用コードを公開します。コード内のコメントをしっかりと読み込んで、APIの息吹を感じてください。
Option Explicit
‘ =================================================================================
‘ 処理名: アセンブリ干渉チェック&Excelレポート自動作成マクロ
‘ 概要 : アクティブなアセンブリの干渉を検出し、部品の組み合わせと干渉体積をExcelに出力する
‘ =================================================================================
Sub RunInterferenceDetectionReport()
‘ — 1. 宣言と初期化 —
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swAssy As SldWorks.AssemblyDoc
Dim swIntMgr As SldWorks.InterferenceDetectionMgr
Set swApp = Application.SldWorks
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. 干渉チェックマネージャー(InterferenceDetectionMgr)の取得 —
Set swIntMgr = swAssy.CreateInterferenceDetectionMgr
If swIntMgr Is Nothing Then
MsgBox “干渉チェックマネージャーの初期化に失敗しました。”, vbCritical, “エラー”
Exit Sub
End If
‘ — 3. 干渉チェックの設定 —
‘ ここがプロのこだわり:目的に応じた設定をコードで確実に担保します
swIntMgr.TreatSubAssembliesAsComponents = False ‘ サブアセンブリを単体部品として扱うか
swIntMgr.IncludeMultiBodyIntersections = True ‘ マルチボディ部品内の干渉も検出する
swIntMgr.MakeInterferenceBodies = False ‘ 干渉ボディ(3D形状)の作成は不要(速度優先のためFalse)
swIntMgr.IgnoreHidden = True ‘ 非表示部品はチェック対象外にする
‘ — 4. 計算の実行 —
Dim vInterferences As Variant
vInterferences = swIntMgr.Run()
‘ マネージャーのセッションを必ず終了する(メモリリーク・ロック防止の鉄則!)
swIntMgr.DeselectAll
If IsEmpty(vInterferences) Then
MsgBox “干渉は検出されませんでした!素晴らしい設計です。”, vbInformation, “結果”
Exit Sub
End If
Dim interferenceCount As Long
interferenceCount = UBound(vInterferences) – LBound(vInterferences) + 1
‘ — 5. Excel連携の準備 —
Dim xlApp As Object
Dim xlWb As Object
Dim xlWs As Object
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 = True ‘ 処理過程を見せるために可視化
Set xlWb = xlApp.Workbooks.Add
Set xlWs = xlWb.Sheets(1)
xlWs.Name = “干渉チェックレポート”
‘ — 6. Excelへヘッダーとデータを書き込み —
With xlWs
.Cells(1, 1).Value = “SolidWorks アセンブリ 干渉チェック レポート”
.Cells(1, 1).Font.Bold = True
.Cells(1, 1).Font.Size = 14
.Cells(2, 1).Value = “対象ファイル: ” & swModel.GetPathName
.Cells(3, 1).Value = “検出日時: ” & Now
‘ テーブルヘッダー
.Cells(5, 1).Value = “No.”
.Cells(5, 2).Value = “部品A 名前”
.Cells(5, 3).Value = “部品B 名前”
.Cells(5, 4).Value = “干渉体積 (mm³)”
Dim i As Long
Dim rowIdx As Long
Dim swIntObj As SldWorks.Interference
Dim compA As SldWorks.Component2
Dim compB As SldWorks.Component2
Dim compNames() As String
For i = 0 To interferenceCount – 1
rowIdx = i + 6
Set swIntObj = vInterferences(i)
‘ 干渉している2つのコンポーネントを取得
Set compA = swIntObj.GetComponent1
Set compB = swIntObj.GetComponent2
Dim nameA As String, nameB As String
If Not compA Is Nothing Then nameA = compA.Name2 Else nameA = “不明”
If Not compB Is Nothing Then nameB = compB.Name2 Else nameB = “不明”
‘ Excelに転記
.Cells(rowIdx, 1).Value = i + 1
.Cells(rowIdx, 2).Value = nameA
.Cells(rowIdx, 3).Value = nameB
.Cells(rowIdx, 4).Value = swIntObj.Volume 1000000000# ‘ 立米(m3)から立方ミリメートル(mm3)へ換算
Set swIntObj = Nothing
Next i
‘ テーブルの見た目を整える
.Range(“A5:D5”).Interior.Color = RGB(51, 51, 51)
.Range(“A5:D5”).Font.Color = RGB(255, 255, 255)
.Range(“A5:D5”).Font.Bold = True
.Columns(“A:D”).AutoFit
End With
MsgBox interferenceCount & “件の干渉を検出し、Excelに出力しました!”, vbInformation, “完了”
End Sub
—
4. 陥りやすい罠と「プロの知見」による回避策
このコードを実務で使うにあたって、初心者が必ずハマる「3つの罠」と、その対策を伝授します。
罠1:セッションの解放忘れ(メモリリーク)
`InterferenceDetectionMgr` は、SolidWorksの内部メモリをかなり専有するオブジェクトです。処理が終わった後にセッションを正しく破棄しないと、SolidWorks本体が重くなったり、最悪の場合は強制終了(クラッシュ)を引き起こします。
- 対策: コード内にある `swIntMgr.DeselectAll` や、オブジェクト変数を `Nothing` に明示的に代入する後始末をサボらないこと。
罠2:単位系の混乱(m3 と mm3 の罠)
SolidWorksのAPIが返す体積(Volume)の基本単位は、常に「立方メートル($m^3$)」です。
日本国内の機械設計で一般的な「$mm^3$」の感覚でそのままExcelに出力すると、とんでもなく小さな数字(例: `0.00000012`)になってしまい、現場のメンバーが混乱します。
- 対策: コード内で行っているように、APIから取得した値に ` 1000000000#` (10の9乗)をかけて、馴染みのある立方ミリメートルに換算してから出力するのがプロの気遣いです。
罠3:非表示部品・固定部品の扱い
「もうボツになった検討用部品」が非表示のままアセンブリに残っていると、それらも含めて干渉チェックが走り、無駄なレポートが生成されます。
- 対策: `swIntMgr.IgnoreHidden = True` を明示的に設定し、画面上で隠されているパーツを計算対象外に間引くことが、実務マクロの必須条件です。
—
5. おわりに:ここから先の世界へ
お疲れ様でした!このマクロをあなたの手元のSolidWorksで走らせた瞬間、ただの3D CADオペレーターから、「設計プロセスの自動化をデザインするエンジニア」へとステップアップしています。
「干渉が見つかったら自動的にその部品の色を赤く変える」といった拡張を加えてみるのも面白いですね。
SolidWorks VBAの基本は、オブジェクトのツリー構造(モデル > マネージャー > 要素)を正確に辿ることだけです。ここをクリアしたあなたなら、どんな複雑な業務自動化も必ず実現できます。
それでは、快適な自動化ライフを!次回の記事もお楽しみに。
