【SolidWorks VBA】アセンブリの「プロパティ未入力」を撲滅せよ!全パーツを自動巡回する設計検証システムの構築
こんにちは。SolidWorksの深淵を日々探求しているエンジニアの皆さん。
設計が終わったアセンブリを開いて、「あ、このパーツの材質プロパティが入っていない……」と冷や汗をかいた経験はありませんか? 人の手によるチェックは必ず漏れます。自動化の真髄は「仕組みでミスを消す」ことにあります。
今回は、アセンブリ内の全コンポーネントを自動巡回し、必須プロパティの欠落を瞬時に検出する「設計検証システム」を一緒に構築していきましょう。マクロの記録ボタンを押すだけの世界から、APIを自在に操るエンジニアへの第一歩です。
—
1. なぜ「巡回(再帰処理)」が必要なのか?
SolidWorksのアセンブリ構造は、フォルダのように階層化されています。メインアセンブリの中にサブアセンブリがあり、その中にさらにパーツがある……この「入れ子構造」を突破するには、再帰関数(Recursive Function)という考え方が必須です。
「目の前のコンポーネントがアセンブリなら、その中身をもう一度調べる」。このルールをコードに落とし込むことで、どれほど深い階層でも漏れなくチェックできます。
—
2. 実装コード:設計検証エンジン
以下のコードをVBAエディタにコピーしてください。これが、あなたの「自動検査官」になります。
Option Explicit
‘ 必須プロパティの定義
Const REQUIRED_PROP1 As String = “材質”
Const REQUIRED_PROP2 As String = “仕上げ”
Const REQUIRED_PROP3 As String = “メーカー名”
Dim swApp As SldWorks.SldWorks
Dim reportMsg As String
Sub Main()
Set swApp = Application.SldWorks
Dim swModel As SldWorks.ModelDoc2
Set swModel = swApp.ActiveDoc
‘ アセンブリが開かれているか確認
If swModel Is Nothing Or swModel.GetType <> swDocASSEMBLY Then
MsgBox “アセンブリを開いて実行してください。”
Exit Sub
End If
reportMsg = “【検証結果:以下の部品でプロパティが欠落しています】” & vbCrLf & vbCrLf
‘ 巡回処理を開始
TraverseComponent swModel.ConfigurationManager.ActiveConfiguration.GetRootComponent3(True), 1
‘ 結果報告
If reportMsg = “【検証結果:以下の部品でプロパティが欠落しています】” & vbCrLf & vbCrLf Then
MsgBox “すべての部品のプロパティは正常です!”
Else
MsgBox reportMsg
End If
End Sub
‘ コンポーネントを再帰的に巡回する関数
Sub TraverseComponent(swComp As SldWorks.Component2, nLevel As Integer)
Dim vChildComps As Variant
Dim swChildComp As SldWorks.Component2
Dim i As Integer
vChildComps = swComp.GetChildren
If IsEmpty(vChildComps) Then Exit Sub
For i = 0 To UBound(vChildComps)
Set swChildComp = vChildComps(i)
‘ プロパティチェックの実行
CheckProperties swChildComp
‘ 再帰呼び出し(サブアセンブリがあれば中まで潜る)
TraverseComponent swChildComp, nLevel + 1
Next i
End Sub
‘ プロパティの存在チェック
Sub CheckProperties(swComp As SldWorks.Component2)
Dim swModel As SldWorks.ModelDoc2
Set swModel = swComp.GetModelDoc2
‘ 抑制されている部品や仮想構成部品はスキップする処理が必要な場合あり
If swModel Is Nothing Then Exit Sub
Dim cusPropMgr As SldWorks.CustomPropertyManager
Set cusPropMgr = swModel.Extension.CustomPropertyManager(“”)
Dim val1 As String, val2 As String, val3 As String
cusPropMgr.Get4 REQUIRED_PROP1, False, “”, val1
cusPropMgr.Get4 REQUIRED_PROP2, False, “”, val2
cusPropMgr.Get4 REQUIRED_PROP3, False, “”, val3
‘ どれか一つでも空ならレポートに追加
If val1 = “” Or val2 = “” Or val3 = “” Then
reportMsg = reportMsg & “部品名: ” & swComp.Name2 & ” (ファイル: ” & swModel.GetTitle & “)” & vbCrLf
End If
End Sub
—
3. このコードが「プロ級」である理由
① `GetRootComponent3` の採用
初心者向けのリファレンスでは古いメソッドが使われがちですが、`GetRootComponent3`を使うことで、アセンブリのルートから確実に情報を取得できます。APIのバージョン管理を意識することは、安定したマクロ開発の第一歩です。
② 再帰構造(TraverseComponent)
この関数は、アセンブリの階層がどれだけ深くても、最後の一部品まで辿り着きます。これこそが、手作業のチェックとは比較にならない「網羅性」の源泉です。
③ 柔軟なプロパティ管理
`CustomPropertyManager`を使い、設定固有プロパティ(Configuration Specific)まで考慮しています。これにより、アセンブリ内での設定切り替えにも対応可能です。
—
4. 陥りやすい罠と対策
- 「抑制された部品」の扱い:
抑制されているパーツは`GetModelDoc2`が`Nothing`を返すことがあります。コード内で`If swModel Is Nothing Then Exit Sub`とガードを入れているのは、エラーでプログラムが強制終了するのを防ぐためです。
- 「仮想コンポーネント」:
アセンブリ内に保存された仮想コンポーネントは、通常のファイルパスを持たないため、特殊なハンドリングが必要になります。まずは今回のコードで「外部ファイル化された部品」を確実にチェックする運用から始めましょう。
—
最後に:ここをクリアすれば、あなたはもう脱初心者です
このマクロを「マクロボタン」としてツールバーに登録しておけば、退勤前のワンクリックで全パーツの品質保証が完了します。
「マクロが動く」という段階から、「組織の設計品質を底上げするツールを作った」という段階へ。SolidWorks VBAの世界へようこそ。次に実装したい機能(例えば、未入力パーツを自動で赤色にハイライトするなど)があれば、またいつでも相談してくださいね。
皆さんの設計環境が、よりスマートで効率的なものになりますように!
