SolidWorks VBAでアセンブリの「合致エラー」を完全自動解析!エラー箇所と部品名をExcelへ集約出力する極意
こんにちは!普段は工場自動化やCAD API開発のフロントラインでアーキテクトをしている先輩エンジニアです。
アセンブリ構築中、突如としてFeatureManagerデザインツリーが黄色(警告)や赤色(エラー)のアイコンで埋め尽くされ、どの部品とどの部品の合致が破綻しているのかを探すだけで日が暮れてしまった……そんな経験はありませんか?
「マクロの記録」から一歩踏み出し、SolidWorks APIの真のパワーを解き放つ時が来ました。
今回は、アセンブリ内の合致(Mate)エラーをプログラム側から全自動で走査(トラバース)し、エラーの原因・影響を受けているコンポーネント名を特定してExcelへ綺麗にレポート出力する高度なツールを構築します。
ここをクリアすれば、SolidWorks VBAの基本〜中級ロジックはバッチリですよ!一緒に本物の自動化技術をマスターしていきましょう。
—
1. なぜ「マクロの記録」ではエラー解析ができないのか?
プログラミング初学者の方が最初に突き当たる壁、それが「マクロの記録の限界」です。
マクロの記録は「ユーザーが画面上で行った操作(マウスのクリックやコマンド実行)」を再現するのは得意ですが、以下の処理は一切記録できません。
1. デザインツリー内部の構造を探索(走査)すること
2. オブジェクトの現在のステータス(正常・警告・エラー)を判定すること
3. エラー情報を元に条件分岐(If文)を行い、外部アプリ(Excel)へデータを書き出すこと
これらを実現するには、SolidWorks APIの「オブジェクトモデル」を正しく理解し、プログラム側からCAD内部のデータ構造へアクセスする必要があります。
—
2. SolidWorks APIにおける「合致(Mate)」の内部構造
コードを書く前に、SolidWorksの内部で合致がどう管理されているかを図解的に理解しておきましょう。
アセンブリ内の合致情報は、デザインツリー上では「合致(MateGroup)」という親機能(Feature)の下に、個々の「合致(Mate2)」が子機能(SubFeature)としてぶら下がる階層構造(ツリー構造)になっています。
[Assembly Document]
│
├── [Feature: MateGroup] (合致フォルダ)
│ │
│ ├── [SubFeature: Mate1] ─── (IMate2 オブジェクト)
│ │ ├── Entity 0 -> Component A (部品1)
│ │ └── Entity 1 -> Component B (部品2)
│ │
│ ├── [SubFeature: Mate2] (エラー発生! ⚠️/❌)
│ │ ├── Entity 0 -> Component B (部品2)
│ │ └── Entity 1 -> Component C ( missing! )
│ └── …
探索のステップ
1. TopレベルのFeatureから `MateGroup` を探す。
2. `MateGroup` の下にある子Feature(`GetFirstSubFeature`)をループで辿る。
3. 各Featureから `IMate2` インターフェースを取得する。
4. Featureのステータス(`GetErrorCode2` や `IsSuppressed` など)をチェックする。
5. 破綻している合致から `IMateEntity2` を介して、関係する コンポーネント名(部品名) を抽出する。
この流れさえ頭に入れば、もう恐れるものはありません!
—
3. 実装:合致エラー解析&Excelレポート出力マクロ
以下のVBAコードをSolidWorksのマクロ編集画面(VBAエディタ)に貼り付けて使用します。
Excelの参照設定を行わなくても動くように「遅延結合(Late Binding)」で実装していますので、コピペしてすぐに動作確認が可能です。
Complete VBA Code
‘ ==============================================================================
‘ 【SolidWorks VBA】 アセンブリ合致エラー自動解析&Excelレポート出力ツール
‘ ==============================================================================
Option Explicit
Sub Main()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swAssy As SldWorks.AssemblyDoc
Dim swFeat As SldWorks.Feature
Dim swSubFeat As SldWorks.Feature
Dim swMate As SldWorks.Mate2
‘ Excel関連変数(遅延結合)
Dim xlApp As Object
Dim xlBook As Object
Dim xlSheet As Object
Dim rowIndex As Long
‘ エラー検出カウント
Dim errorCount As Long
‘ SolidWorksに接続
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
‘ ドキュメントチェック
If swModel Is Nothing Then
MsgBox “SolidWorksでアセンブリモデルを開いてから実行してください。”, vbExclamation, “エラー”
Exit Sub
End If
If swModel.GetType <> swDocASSEMBLY Then
MsgBox “このマクロはアセンブリドキュメントでのみ動作します。”, vbExclamation, “エラー”
Exit Sub
End If
Set swAssy = swModel
‘ 描画処理を停止してパフォーマンス向上
swModel.FeatureManager.EnableFeatureTree = False
‘ — Excelの初期化 —
On Error Resume Next
Set xlApp = CreateObject(“Excel.Application”)
On Error GoTo 0
If xlApp Is Nothing Then
MsgBox “Excelを起動できませんでした。”, vbCritical, “エラー”
swModel.FeatureManager.EnableFeatureTree = True
Exit Sub
End If
xlApp.Visible = True
Set xlBook = xlApp.Workbooks.Add
Set xlSheet = xlBook.Sheets(1)
xlSheet.Name = “Mate_Error_Report”
‘ ヘッダーの作成
With xlSheet
.Cells(1, 1).Value = “No.”
.Cells(1, 2).Value = “合致機能名”
.Cells(1, 3).Value = “ステータス / エラー種別”
.Cells(1, 4).Value = “対象コンポーネント 1”
.Cells(1, 5).Value = “対象コンポーネント 2”
‘ ヘッダーの装飾
With .Range(“A1:E1”)
.Font.Bold = True
.Interior.Color = RGB(50, 80, 130)
.Font.Color = RGB(255, 255, 255)
.HorizontalAlignment = -4108 ‘ xlCenter
End With
End With
rowIndex = 2
errorCount = 0
‘ — デザインツリーの走査(Feature Traversing) —
Set swFeat = swModel.FirstFeature
Do While Not swFeat Is Nothing
‘ “MateGroup” (合致フォルダ) を探索
If swFeat.GetTypeName2 = “MateGroup” Then
‘ 子Feature(個々の合致)へ入る
Set swSubFeat = swFeat.GetFirstSubFeature
Do While Not swSubFeat Is Nothing
‘ 子FeatureがMate2かどうか確認
If swSubFeat.GetTypeName2 = “Mate2” Then
Set swMate = swSubFeat.GetSpecificFeature2
‘ 合致のエラー・警告ステータスを判定
Dim errStatus As String
errStatus = GetMateStatusString(swSubFeat)
‘ 正常以外の(エラーまたは警告、抑制状態など)場合にレポート出力
If errStatus <> “正常” Then
errorCount = errorCount + 1
‘ 関係するコンポーネント名を取得
Dim comp1Name As String
Dim comp2Name As String
GetMateComponentNames swMate, comp1Name, comp2Name
‘ Excelへ出力
xlSheet.Cells(rowIndex, 1).Value = errorCount
xlSheet.Cells(rowIndex, 2).Value = swSubFeat.Name
xlSheet.Cells(rowIndex, 3).Value = errStatus
xlSheet.Cells(rowIndex, 4).Value = comp1Name
xlSheet.Cells(rowIndex, 5).Value = comp2Name
‘ エラー行の着色(視認性向上)
If InStr(errStatus, “エラー”) > 0 Or InStr(errStatus, “破綻”) > 0 Then
xlSheet.Rows(rowIndex).Interior.Color = RGB(255, 230, 230) ‘ 薄い赤
ElseIf InStr(errStatus, “警告”) > 0 Or InStr(errStatus, “過剰”) > 0 Then
xlSheet.Rows(rowIndex).Interior.Color = RGB(255, 255, 200) ‘ 薄い黄
End If
rowIndex = rowIndex + 1
End If
End If
‘ 次の合致へ
Set swSubFeat = swSubFeat.GetNextSubFeature
Loop
End If
‘ 次のFeatureへ
Set swFeat = swFeat.GetNextFeature
Loop
‘ — 仕上げ(フォーマット整列) —
xlSheet.Columns(“A:E”).AutoFit
swModel.FeatureManager.EnableFeatureTree = True
‘ 結果表示
If errorCount > 0 Then
MsgBox “解析が完了しました。” & vbCrLf & _
“検出された問題のある合致: ” & errorCount & ” 件”, vbInformation, “完了”
Else
MsgBox “エラーまたは警告が発生している合致は見つかりませんでした!素晴らしいアセンブリです。”, vbInformation, “完了”
End If
End Sub
‘ ==============================================================================
‘ 【補助関数1】 合致Featureのステータス文字列を取得
‘ ==============================================================================
Private Function GetMateStatusString(ByVal swFeat As SldWorks.Feature) As String
‘ 抑制(Suppressed)状態のチェック
If swFeat.IsSuppressed Then
GetMateStatusString = “抑制中 (Suppressed)”
Exit Function
End If
‘ エラーコードの取得
Dim errorCode As Long
errorCode = swFeat.GetErrorCode2()
‘ SW APIのErrorCode判定 (swFeatureError_e)
Select Case errorCode
Case 0
GetMateStatusString = “正常”
Case 1, 131072 ‘ 一般的なエラーまたは破綻
GetMateStatusString = “❌ エラー (参照喪失/破綻)”
Case 2, 262144 ‘ 警告 / 過剰拘束
GetMateStatusString = “⚠️ 警告 (過剰拘束の可能性)”
Case Else
GetMateStatusString = “❌ エラー (コード: ” & errorCode & “)”
End Select
End Function
‘ ==============================================================================
‘ 【補助関数2】 合致に関連する2つのコンポーネント名を取得
‘ ==============================================================================
Private Sub GetMateComponentNames(ByVal swMate As SldWorks.Mate2, ByRef comp1Name As String, ByRef comp2Name As String)
On Error Resume Next
comp1Name = “不明 (参照消失)”
comp2Name = “不明 (参照消失)”
If swMate Is Nothing Then Exit Sub
‘ 合致エンティティ(面、線、点など)の数を取得
Dim entityCount As Long
entityCount = swMate.GetMateEntityCount
‘ 1つ目の要素のコンポーネント取得
If entityCount >= 1 Then
Dim ent1 As SldWorks.MateEntity2
Set ent1 = swMate.MateEntity(0)
If Not ent1 Is Nothing Then
Dim comp1 As SldWorks.Component2
Set comp1 = ent1.ReferenceComponent
If Not comp1 Is Nothing Then comp1Name = comp1.Name2
End If
End If
‘ 2つ目の要素のコンポーネント取得
If entityCount >= 2 Then
Dim ent2 As SldWorks.MateEntity2
Set ent2 = swMate.MateEntity(1)
If Not ent2 Is Nothing Then
Dim comp2 As SldWorks.Component2
Set comp2 = ent2.ReferenceComponent
If Not comp2 Is Nothing Then comp2Name = comp2.Name2
End If
End If
On Error GoTo 0
End Sub
—
4. コードの深掘り解説:プロの設計思想
今回書いたコードの重要ポイントを、現場の視点から紐解いてみましょう。
① `MateGroup` と `Mate2` の二段構えループ
アセンブリのFeatureManagerツリーを走査する際、すべてのFeatureを無差別に調べるのは非効率です。
SolidWorksでは、合致は必ず `MateGroup`(ツリー上の「合致」フォルダ)に集約されます。そのため、Topレベルで `MateGroup` を探し、その子要素(`GetFirstSubFeature`)だけをループ走査する手法を取ることで、処理時間を大幅に短縮しています。
② `IMateEntity2::ReferenceComponent` による部品の逆引き
合致エラーが発生した時、最も知りたいのは「どの部品が原因か?」ですよね。
合致オブジェクト(`Mate2`)から `MateEntity(i)` を取り出し、そこから `.ReferenceComponent` を呼び出すことで、その面や軸が「どのコンポーネント(`Component2`)に属しているか」を逆引き指定できます。
要素が消滅してアセンブリ上で破綻している(参照喪失)場合でも、`On Error Resume Next` と組み合わせることで安全に「不明 (参照消失)」として補足します。
③ Excel遅延結合(Late Binding)の採用
`CreateObject(“Excel.Application”)` を使用して遅延結合を行っています。これにより、利用者のPC環境に依存せず(Excelのバージョンが2016でも2019でも365でも)、事前設定不要でマクロを配布・実行できます。
—
5. 陥りやすい罠とパフォーマンス改善のコツ
開発現場でよく直面するトラブルと、その回避策(ハマりポイント)をお伝えします。
罠1:サブアセンブリ内の合致エラーが拾えない?
今回のコードは「トップレベルアセンブリの合致」を走査対象としています。
もし「サブアセンブリ内部の合致エラー」まで深掘りして解析したい場合は、アセンブリ構造を再帰呼び出し(Recursive Call)でツリー走査する設計に拡張する必要があります。
罠2:大規模アセンブリでマクロがフリーズする
何千点もの部品を含むアセンブリでマクロを動かすと、画面の再描画にリソースを取られて処理が重くなります。
今回のコードでは、以下の1行を組み込んでいます。
swModel.FeatureManager.EnableFeatureTree = False
ツリー描画の更新を一時的にオフにするプロパティです。処理が終わったら `True` に戻します。これだけで実行速度が数倍〜数十倍にアップしますので、実務では必須のテクニックです。
—
まとめ:マクロの記録を脱出し、設計環境のアーキテクトへ!
今回のツールを導入すれば、巨大アセンブリの合致破綻のチェックを数秒で完了し、さらにExcelで社内共有や修正タスクの割り振りができるようになります。
1. `Feature` と `Mate2` の階層構造を把握する
2. `MateEntity2` からコンポーネント情報を逆引きする
3. `GetErrorCode2` でステータスを判定してExcelへ出力する
このパターンは、合致以外の機能(例えば「エラーが起きているスケッチの特定」や「参照が切れているフィーチャーのリストアップ」など)にもそのまま応用できます。
ここをクリアすれば、SolidWorks VBAの基本はバッチリですよ!
ぜひご自身の日常業務に合わせてカスタマイズし、快適な自動化ライフを手に入れてくださいね。応援しています!
