こんにちは!SolidWorks自動化の世界へようこそ。
チーフアーキテクトの私です。
「マクロの記録」ボタンを押してコードを生成させるだけのステージは、もう卒業しましたね。今日あなたが手に入れるのは、実務の現場で絶大な効果を発揮する「干渉チェックの自動レポート化ツール」の全貌です。
アセンブリの設計において、部品同士の干渉(めり込み)チェックは避けて通れない重要工程です。しかし、何十点、何百点とあるアセンブリから干渉箇所を手作業で見つけ出し、キャプチャを撮ってExcelに貼り付ける……想像しただけで気が遠くなりませんか?
大丈夫。今回は、`IAssemblyDoc.FeatureInterference2` という強力なAPIを使い、「干渉の検出」「ビューポートのキャプチャ」「Excelへのスマートなレイアウト出力」までをワンクリックで完結させる極上のコードをあなたに授けましょう。
ここをクリアすれば、SolidWorks VBAのオブジェクトモデルの本質が見えてきます。一緒にマスターしていきましょう!
—
1. 開発の全体像とアーキテクチャの理解
今回のツールは、SolidWorksとExcelの二つのアプリケーションをVBAから自在に操ります。
1. Activeなアセンブリドキュメントを取得する (`SldWorks` / `ModelDoc2` / `AssemblyDoc`)。
2. 干渉チェック(FeatureInterference2)を実行し、検出された干渉コンポーネントのペアと貫通ボリュームを取得する。
3. 干渉部分を画面にズームアップし、APIの機能を使って画像ファイルとしてキャプチャ(保存)する。
4. 起動したExcelに検査報告書のフォーマットを自動構築し、「テキストデータ」と「画像」をミリ単位で美しくレイアウトして流し込む。
この一連の流れを、エラーハンドリングを網羅した実務レベルのコードで実装します。
—
2. 準備:参照設定の魔法
VBAからExcelを操作するため、またはコードをスマートに書くために、事前の準備をしておくと開発効率が爆発的に上がります。
VBAエディタ(Alt + F11)を開き、[ツール] > [参照設定] から以下にチェックを入れてください。
- Microsoft Excel XX.X Object Library (Excelを自在に操作するため)
※これを行わなくても `CreateObject` で動かせますが、今回はコードの書きやすさとインテリセンス(入力補助)の恩恵を受けるために、アーリーバインディングの視点も交えて解説します。
—
3. 実装コード:干渉チェック自動レポート化マクロ
以下のコードをSolidWorksの標準モジュールに貼り付けてください。実務ですぐに使えるよう、細部にまでコメントとプロの技を仕込んでいます。
Option Explicit
‘ ==============================================================================
‘ 担当アーキテクト特製:アセンブリ干渉チェック&Excelレポート自動化ツール
‘ ==============================================================================
Sub GenerateInterferenceReport()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swAssy As SldWorks.AssemblyDoc
‘ アプリケーションとドキュメントの取得
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. 干渉チェックの実行 (FeatureInterference2)
‘ 戻り値は干渉部品の配列(Variant型)
Dim vInterferenceList As Variant
‘ 引数の詳細:
‘ コポーネント配列(Emptyで全指定), 計算オプション(通常は0), 貫通計算(True/False) 等
vInterferenceList = swAssy.FeatureInterference2(Empty)
If IsEmpty(vInterferenceList) Then
MsgBox “干渉は検出されませんでした!素晴らしい設計です。”, vbInformation, “結果”
Exit Sub
End If
Dim interferenceCount As Long
interferenceCount = (UBound(vInterferenceList) – LBound(vInterferenceList) + 1)
MsgBox interferenceCount & “件の干渉が検出されました。Excelレポートを作成します。”, vbInformation, “処理開始”
‘ 3. Excelの準備
Dim xlApp As Object
Dim xlWb As Object
Dim xlWs As Object
Set xlApp = CreateObject(“Excel.Application”)
xlApp.Visible = True
Set xlWb = xlApp.Workbooks.Add
Set xlWs = xlWb.Sheets(1)
xlWs.Name = “干渉チェック結果”
‘ ヘッダーの作成
With xlWs
.Cells(1, 1).Value = “No.”
.Cells(1, 2).Value = “干渉コンポーネント A”
.Cells(1, 3).Value = “干渉コンポーネント B”
.Cells(1, 4).Value = “干渉体積 (mm^3)”
.Cells(1, 5).Value = “干渉箇所キャプチャ”
‘ ヘッダーの書式設定
.Range(“A1:E1”).Font.Bold = True
.Range(“A1:E1”).Interior.Color = RGB(220, 230, 241)
End With
‘ 一時画像保存用のパス作成
Dim tempImgPath As String
tempImgPath = Environ(“TEMP”) & “\sw_interference_temp.png”
Dim i As Long
Dim rowIdx As Long
rowIdx = 2 ‘ データの書き込み開始行
‘ 4. 干渉データのループ処理とレポートへの転記
For i = LBound(vInterferenceList) To UBound(vInterferenceList)
Dim swInterferenceObj As SldWorks.Interference
Set swInterferenceObj = vInterferenceList(i)
Dim compA As SldWorks.Component2
Dim compB As SldWorks.Component2
Set compA = swInterferenceObj.Component1
Set compB = swInterferenceObj.Component2
Dim compNameA As String
Dim compNameB As String
compNameA = IIf(compA Is Nothing, “アセンブリ自体”, compA.Name2)
compNameB = IIf(compB Is Nothing, “アセンブリ自体”, compB.Name2)
Dim volume As Double
volume = swInterferenceObj.Volume
‘ 該当する干渉部分にズームしてハイライトする処理(APIの醍醐味!)
‘ ※ここで干渉しているジオメトリを取得してビューを合わせます
Dim swModelDocExt As SldWorks.ModelDocExtension
Set swModelDocExt = swModel.Extension
‘ 干渉パーツを選択状態にしてズーム
swModel.ClearSelection2 True
If Not compA Is Nothing Then compA.Select4 False, Nothing, False
If Not compB Is Nothing Then compB.Select4 True, Nothing, False
swModel.ViewZoomToSelection
‘ ビューポートのキャプチャを保存
‘ SaveAsImageメソッドを使用 (幅, 高さ, パス)
swModelDocExt.SaveAsImage tempImgPath, 800, 600
‘ Excelへデータを書き込み
xlWs.Cells(rowIdx, 1).Value = (i + 1)
xlWs.Cells(rowIdx, 2).Value = compNameA
xlWs.Cells(rowIdx, 3).Value = compNameB
xlWs.Cells(rowIdx, 4).Value = volume
‘ 行の高さを画像が入るように調整 (約100ピクセル分)
xlWs.Rows(rowIdx).RowHeight = 80
‘ Excelに画像を挿入
Dim targetCell As Object
Set targetCell = xlWs.Cells(rowIdx, 5)
Dim pic As Object
Set pic = xlWs.Pictures.Insert(tempImgPath)
With pic
.Top = targetCell.Top + 2
.Left = targetCell.Left + 2
.Height = 76 ‘ 行の高さに合わせる
.Width = 100
End With
‘ 次の行へ
rowIdx = rowIdx + 1
‘ メモリ解放
Set swInterferenceObj = Nothing
Next i
‘ 列幅の自動調整
xlWs.Columns(“A:D”).AutoFit
xlWs.Columns(“E”).ColumnWidth = 20
‘ 一時ファイルの削除
If Dir(tempImgPath) <> “” Then Kill tempImgPath
MsgBox “レポートの作成が完了しました!”, vbInformation, “完了”
‘ オブジェクトのクリーンアップ
Set xlWs = Nothing
Set xlWb = Nothing
Set xlApp = Nothing
End Sub
—
4. チーフアーキテクトが解説するコードの急所とポイント
ここからは、コードの裏側にある「プロの知見」をいくつかシェアします。これを理解しておくと、他のAPIを扱うときにも応用が利くようになります。
① `FeatureInterference2` の圧倒的な破壊力
マクロの記録では、干渉チェックのダイアログが立ち上がって止まってしまいます。しかし、`AssemblyDoc.FeatureInterference2` メソッドを使えば、UIを介さずにバックグラウンド(メモリ上)で一瞬にして干渉計算を行い、`Interference` オブジェクトの配列として結果を返してくれます。
この「UIをバイパスして直接データ構造にアクセスする」というアプローチこそが、業務自動化の極意です。
② `SaveAsImage` によるビューポートの切り取り
検出された干渉ペア(Component1 と Component2)を `Select4` で選択し、`ViewZoomToSelection` で画面いっぱいにズームアップさせています。その直後に `ModelDocExtension.SaveAsImage` を呼び出すことで、「今まさに問題となっている箇所をピンポイントで切り抜いた画像」を瞬時に生成できます。
人間が手作業で「画面キャプチャ → ペイントでトリミング → Excelに貼り付け」をやっていた作業が、わずかコンマ数秒で自動化される瞬間です。
③ Excelとのスマートな連携(レイトバインディングの採用)
コード内では `CreateObject(“Excel.Application”)` を使っています。これにより、実行環境のExcelのバージョン違い(Office 2016, 2019, 365など)による参照設定の競合エラー(コンパイルエラー)を華麗に回避できます。実務で配布するマクロにおいて、この「環境依存エラーへの耐性」は非常に重要です。
—
5. 陥りやすい罠とトラブルシューティング
現場でこのマクロを動かす際、初心者がつまずきやすいポイントを先回りして解説します。
- Q. 「コンポーネントが見つかりません」というエラーが出る
- A. アセンブリ内に「抑制されたコンポーネント」や「軽量コンポーネント」が含まれていると、干渉計算が正しく行われない場合があります。実行前にアセンブリを「図解・完全解決」状態にしておくのが安全です。
- Q. Excelの画像位置がズレる
- A. `Pictures.Insert` はリンク画像として挿入されることがあるため、Excelの仕様によっては環境が変わると画像が消えることがあります。より厳密に制御したい場合は `Shapes.AddPicture` を用いるのがプロの選択ですが、まずは今回のシンプルなコードで挙動を確認してみてください。
—
6. おわりに:ここから先の世界へ
お疲れ様でした!このコードを動かした瞬間、あなたの設計業務のスピードは文字通り何倍にも跳ね上がったはずです。
SolidWorks VBAの基本、そしてAPIオブジェクトモデルの扱い方。
「オブジェクトを取得する」⇒「メソッドで処理を命令する」⇒「結果を外部(Excelなど)に出力する」というサイクルをマスターすれば、もう怖いものはありません。
次は、これをボタン一つでリボンメニューから呼び出せるようにアドイン化したり、PDFレポートとして出力する機能を追加してみるのも面白いでしょう。
あなたの自動化エンジニアとしての第一歩を、心から応援しています。
それでは、また次の極限の知見でお会いしましょう!
