【入門編】【上級プロ】アセンブリの干渉チェック(CollisionDetection / InterferenceDetection)のVBA自動実行と結果のCSV出力 – SolidWorks VBA解析バイブル

スポンサーリンク

こんにちは!SolidWorks VBAの世界へようこそ。
日々、複雑なアセンブリと格闘し、設計変更の嵐にすり減っていませんか?

「図面上では完璧に見えたのに、いざ実機を組んだら干渉して入らない……」
「設計変更のたびに、目視と手動の干渉チェックで残業の嵐……」

そんな絶望を味わったあなたへ。今回は、SolidWorks VBAの真骨頂である「アセンブリ干渉チェックの自動実行と、結果のCSV出力」という、実務で即座に使える超実践的な自動化テクニックを伝授します。

ここをクリアすれば、マクロの記録をポチポチ押すだけの初心者からは完全に卒業。SolidWorksのAPIを意のままに操る「プロ仕様の自動化エンジニア」への扉が開きます。さあ、一緒に深淵なるAPIの世界へ飛び込みましょう!

—

なぜ「干渉チェック」をVBAで自動化すべきなのか?

SolidWorksには標準で「干渉チェック(Interference Detection)」機能が備わっています。GUIからポチポチ操作すれば結果は出ますよね。では、なぜわざわざVBAで自動化するのでしょうか?

理由は単純明快、「ヒューマンエラーの排除」と「圧倒的な爆速化」です。

1. チェック漏れの完全防止: 数百点ある部品の中で、見落としがちな隠れ部品の干渉を完全網羅します。
2. 客観的なエビデンス(CSV)の残骸化: どの部品とどの部品が、何ミリ食い込んでいるのかを構造化データとして出力し、設計レビューの資料として直結させられます。
3. 設計プロセスの自動化チェーンへの組み込み: 夜間にアセンブリを自動で読み込み、朝には干渉レポートがCSVで机上に置かれている……そんな夢のような環境が作れます。

SolidWorks VBAのオブジェクト指向の作法さえ掴めば、実はコード自体はそれほど難しくありません。一緒に紐解いていきましょう!

—

プロが教える:干渉チェックAPIの核心と設計思想

今回使用する主役は、`IAssemblyDoc` インターフェースが持つ `InterferenceDetectionMgr` というオブジェクトです。

このマネージャーは、いわば「干渉チェックの司令塔」。
1. 干渉チェックの条件を設定する(貫通部を無視するか、隠れ部品を含めるか等)
2. チェックを実行し、衝突ペアをリストアップする
3. 各ペアの干渉体積や、交差しているボディの情報を回収する

この一連のライフサイクルをVBAから正確にコントロールします。

陥りやすい罠:アセンブリの「文脈(コンテキスト)」と重み

APIを叩く際、最もやりがちなエラーが「ドキュメントの活性化(ActiveDoc)に依存したコード書き」です。画面が開いているアクティブなドキュメントだけに頼ると、裏でバッチ処理を回した時に盛大にクラッシュします。
プロは常に、ポインタ(変数)で確実にオブジェクトを把持して処理を進めます。

—

【実践】干渉チェック自動化&CSV出力マクロ全コード

お待たせしました。実務の現場でそのままコピペして使える、完全版のVBAコードを公開します。
VBAエディタ(Alt + F11)を開き、標準モジュールに貼り付けて実行してください。

Option Explicit

‘ ==============================================================================
‘ 担当:チーフアーキテクト
‘ 概要:アセンブリの干渉チェックを自動実行し、結果をCSVへ出力するプロ仕様マクロ
‘ 前提:アクティブなドキュメントが「アセンブリ」であること
‘ ==============================================================================
Sub RunInterferenceDetectionToCSV()

Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swAssy As SldWorks.AssemblyDoc
Dim swInterferenceMgr As SldWorks.InterferenceDetectionMgr

‘ アプリケーションとモデルの取得
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc

‘ 1. エラーハンドリング:アセンブリが開かれているか検証
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 swInterferenceMgr = swAssy.GetInterferenceDetectionMgr
If swInterferenceMgr Is Nothing Then
MsgBox “干渉チェックマネージャーの取得に失敗しました。”, vbCritical, “エラー”
Exit Sub
End If

‘ ==============================================================================
‘ 干渉チェックのオプション設定(ここがプロのこだわりポイント)
‘ ==============================================================================
swInterferenceMgr.TreatCoincidenceAsInterference = False ‘ 面の接触は干渉とみなさない
swInterferenceMgr.IncludeMultibodyPrtsInterparts = True ‘ マルチボディ部品内の干渉も含む
swInterferenceMgr.MakePartsTransparent = False ‘ 処理速度優先のため透明化しない
swInterferenceMgr.CreateSubAssemblies = False ‘ サブアセンブリとしてまとめない
swInterferenceMgr.IgnoreHiddenComponents = True ‘ 非表示部品はチェック対象外にする

‘ 3. 干渉チェックの実行
Dim status As Long
status = swInterferenceMgr.Run()

If status = 0 Then
MsgBox “干渉チェックの実行に失敗しました。”, vbCritical, “エラー”
swInterferenceMgr.Clear
Exit Sub
End If

‘ 4. 結果の取得と解析
Dim interferenceCount As Long
interferenceCount = swInterferenceMgr.GetInterferenceCount

If interferenceCount = 0 Then
MsgBox “素晴らしい!干渉箇所は検出されませんでした。”, vbInformation, “結果”
swInterferenceMgr.Clear
Exit Sub
End If

‘ 干渉ペアのオブジェクト配列を取得
Dim vInterferences As Variant
vInterferences = swInterferenceMgr.GetInterferences

‘ 5. CSVファイルへの出力処理
Dim desktopPath As String
Dim csvFilePath As String
desktopPath = CreateObject(“WScript.Shell”).SpecialFolders(“Desktop”)
csvFilePath = desktopPath & “\Interference_Report_” & Format(Now, “yyyymmdd_HHMMSS”) & “.csv”

Dim fileNum As Integer
fileNum = FreeFile

Open csvFilePath For Output As #fileNum

‘ CSVヘッダーの書き込み
Print #fileNum, “No,Component 1,Component 2,Interference Volume (mm3)”

Dim i As Long
Dim swInterferenceObj As SldWorks.Interference
Dim comp1 As SldWorks.Component2
Dim comp2 As SldWorks.Component2
Dim comp1Name As String
Dim comp2Name As String
Dim intVolume As Double

For i = 0 To UBound(vInterferences)
Set swInterferenceObj = vInterferences(i)

‘ 衝突している2つのコンポーネントを取得
Set comp1 = swInterferenceObj.GetComponent(0)
Set comp2 = swInterferenceObj.GetComponent(1)

‘ コンポーネント名が取得できるか安全確認
If Not comp1 Is Nothing Then
comp1Name = comp1.Name2
Else
comp1Name = “[Root/Unknown]”
End If

If Not comp2 Is Nothing Then
comp2Name = comp2.Name2
Else
comp2Name = “[Root/Unknown]”
End If

‘ 干渉体積(立方ミリメートル)の取得
intVolume = swInterferenceObj.Volume

‘ CSV行の書き込み(カンマ区切り)
Print #fileNum, (i + 1) & “,” & “””” & comp1Name & “””” & “,” & “””” & comp2Name & “””” & “,” & intVolume

Next i

Close #fileNum

‘ 6. マネージャーのメモリ解放(非常に重要!)
swInterferenceMgr.Clear

‘ 完了通知
MsgBox “干渉チェックが完了しました!” & vbCrLf & _
“検出件数: ” & interferenceCount & “件” & vbCrLf & _
“出力先: ” & csvFilePath, vbInformation, “処理成功”

End Sub

—

コードの要所解説:ここが分かれば怖くない!

初心者からワンランク上にステップアップするために、コードのキモとなる部分を噛み砕いて解説します。

① `Option Explicit` のお約束

コードの最上部に書かれているこの一文。変数宣言の強制を意味します。「タイポによるバグ」を完全に防ぐための、プログラマーの防護壁です。絶対に省略しないでください。

② オプション設定の妙味 (`swInterferenceMgr`)

干渉チェックは重たい処理です。無駄な計算を省くために、「非表示部品は無視する (`IgnoreHiddenComponents = True`)」や「面の接触はエラーにしない (`TreatCoincidenceAsInterference = False`)」といったフィルターをコードで適切に設定することが、実務でのマクロの安定稼働に直結します。

③ 忘れちゃいけないメモリの解放 (`swInterferenceMgr.Clear`)

SolidWorksのAPIで最も恐ろしいのは「メモリリーク(COMオブジェクトの残存)」です。干渉チェックのような重い計算を行った後、マネージャーをクリアせずに放置すると、SolidWorks本体が不安定になったり、メモリ食い虫になって強制終了したりします。
処理の最後には必ず `swInterferenceMgr.Clear` を呼ぶ、これを鉄の掟として覚えておいてください。

—

陥りやすいエラーと対策

1. 「型が一致しません」という実行時エラーが出る

  • 原因: アセンブリを開いていない状態でマクロを実行した、またはサブアセンブリの階層構造で予期せぬ空のオブジェクトを掴んでしまった場合。
  • 対策: コード内の `If swModel.GetType <> swDocASSEMBLY Then` のような事前バリデーションを必ず通すようにしてください。

2. CSVの文字化け問題

  • 原因: Excelで直接CSVを開いたときにShift-JIS以外のエンコーディングだと文字化けすることがあります。
  • 対策: 必要に応じて `ADODB.Stream` オブジェクトを使って UTF-8 (BOM付き) で保存する仕組みに拡張すると、より実用的になります。

—

おわりに:ここをクリアすれば、もう怖くない!

お疲れ様でした!今回はSolidWorks VBAを用いたアセンブリの干渉チェック自動化と、実用的なCSV出力の仕組みを解説しました。

「ただ画面を自動でポチポチさせるマクロ」から、「データを構造化し、外部ファイルとして出力・活用するエンジニアリングツール」への進化。この一歩を踏み出せたあなたは、もう立派な自動化エンジニアの仲間入りです。

ここをクリアすれば、SolidWorks APIの基本構造(モデル取得 ➔ マネージャー操作 ➔ 配列の走査 ➔ 外部出力)は完全にバッチリです。ぜひ自分の設計環境に導入し、圧倒的な業務効率化を体感してください。

それでは、次回の極限の知見でお会いしましょう。あなたの設計ライフが、よりクリエイティブで快適なものになりますように!

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