SolidWorks VBAの真髄:アセンブリの「合致(Mate)」を掌握し、カオスな設計をクリーンに保つ技術
こんにちは。SolidWorksの自動化の世界へようこそ。
「マクロの記録」ボタンを押して、生成されたコードの羅列に絶望したことはありませんか?実は、あれはスタート地点に過ぎません。真のエンジニアが目指すべきは、SolidWorksのAPIという「神経系」を直接叩き、設計の意図をコードで制御することです。
今回は、多くのアセンブリ設計者が直面する「合致(Mate)の迷宮」を攻略します。名前がバラバラ、あるいはデフォルトの「合致1」「合致2」が並ぶだけの無秩序なアセンブリを、VBAで一括走査し、ルール違反を暴き出す方法を伝授します。
—
なぜ「合致の命名規則」が重要なのか?
アセンブリが複雑化すると、合致エラーが発生した際に「どの部品のどの拘束が壊れたのか」を特定するだけで数時間を費やすことになります。「命名は設計の意志」です。これを自動でチェックできる環境があれば、あなたの設計品質は劇的に向上します。
今回のミッション
1. アセンブリ内のすべての「合致」を取得する。
2. 名前が特定のルール(例: `Mate_`から始まっているか)に従っているか判定する。
3. ルール違反の合致をリストアップし、イミディエイトウィンドウに表示する。
—
実践コード:Mate Audit Script
以下のコードをVBAエディタに貼り付けてください。SolidWorksのAPI構造を理解するための最小限にして最強の構成です。
Option Explicit
‘ SolidWorksのメインオブジェクトを取得する関数
Sub AuditMateNames()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swAssy As SldWorks.AssemblyDoc
Dim swFeat As SldWorks.Feature
Dim swMate As SldWorks.MateFeatureData
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
‘ アセンブリ以外で実行された場合のガード
If swModel Is Nothing Or swModel.GetType <> swDocASSEMBLY Then
MsgBox “アセンブリを開いた状態で実行してください。”, vbCritical
Exit Sub
End If
Set swAssy = swModel
Debug.Print “— 合致命名規則チェック開始 —”
‘ FeatureManagerを走査する
Set swFeat = swModel.FirstFeature
Do While Not swFeat Is Nothing
‘ 特徴が「合致グループ」であるかを確認
If swFeat.GetTypeName2 = “MateGroup” Then
‘ 合致グループ内の各合致を走査
Call ProcessMates(swFeat)
End If
Set swFeat = swFeat.GetNextFeature
Loop
Debug.Print “— チェック終了 —”
End Sub
Private Sub ProcessMates(ByVal swMateGroup As SldWorks.Feature)
Dim swSubFeat As SldWorks.Feature
Dim mateName As String
Set swSubFeat = swMateGroup.GetFirstSubFeature
Do While Not swSubFeat Is Nothing
mateName = swSubFeat.Name
‘ 【命名規則のチェック】 “Mate_” で始まっていないものを警告
If Not Left(mateName, 5) = “Mate_” Then
Debug.Print “[警告] 命名規則違反: ” & mateName
End If
Set swSubFeat = swSubFeat.GetNextSubFeature
Loop
End Sub
—
コードの心臓部を読み解く
このコードには、SolidWorks VBAを習得する上で外せない「3つの鍵」が含まれています。
1. `FirstFeature` と `GetNextFeature` のループ
SolidWorksのモデルは「ツリー構造(FeatureManager)」で管理されています。プログラムにとってアセンブリは、部品と合致が連なる「リスト」です。このループを回すことで、ツリーの先頭から末尾まで全要素を舐めるように走査できます。
2. `GetTypeName2` による型判別
アセンブリには穴、押し出し、部品の配置など様々な情報が混在しています。「合致」だけを抽出するために、APIが返す型名が `MateGroup` であるかを判定しています。これがプログラミングにおける「選別」の技術です。
3. `GetFirstSubFeature` の重要性
実は、合致は「合致グループ」という大きな箱の中に入っています。グループを取り出した後、さらにその中を覗くために `SubFeature` を使う。この多層構造を理解できるかどうかが、初心者と中級者の分かれ道です。
—
初心者が陥りやすいエラーと回避策
- 「オブジェクト変数または With ブロック変数が設定されていません」というエラー
- 原因: `swModel` が正しく取得できていない(何も開いていない)状態で処理を行おうとしています。
- 対策: コード冒頭の `If swModel Is Nothing` のようなガード節を必ず入れましょう。これがプログラムを「安定」させる秘訣です。
- 重いアセンブリでフリーズする
- 原因: 数千個の合致をループすると、Excelの画面更新やメモリ消費が重くなります。
- 対策: 必要であれば `swApp.Visible = False` を一時的に活用したり、処理の合間に `DoEvents` を挟んでOSに制御を戻す工夫が必要です。
—
最後に:ここをクリアすれば、あなたはもう「自動化エンジニア」です
合致の名称チェックは、単なる事務作業ではありません。「設計の標準化」という、エンジニアリングの根幹を自動化する第一歩です。
このコードが動いたら、次は「命名規則に違反している合致を自動的にリネームする」機能や、「エラー(赤色)になっている合致だけを抽出する」機能へと拡張してみてください。
あなたの設計環境を、あなたの手で、より洗練されたものにしていきましょう。応援しています。質問があれば、いつでもこのコードをいじり倒してみてくださいね。それが最短の学習法ですから。
