SolidWorks VBAの「スパゲッティ」を断ち切る:拡張可能な合致ビルダーへの道
こんにちは。自動化の深淵へようこそ。
多くの現場で「マクロの記録」から始めたコードが、次第に修正不可能なスパゲッティ状態になり、頭を抱えているエンジニアを見かけます。
特にアセンブリの合致(Mate)処理は、部品が増えるほどコードが複雑化しがちです。今回は、場当たり的なコードから脱却し、「拡張可能な合致ビルダー」という設計思想へのリファクタリングを伝授します。
—
1. なぜ「手続き型」では限界が来るのか?
「マクロの記録」で生成されるコードは、実行手順をただ羅列しただけの「手続き型」です。
- 問題点1: 同じような `SelectByID2` が何度も登場し、修正箇所が分散する。
- 問題点2: エラーハンドリングが漏れ、特定の部品が見つからないだけで全滅する。
- 問題点3: 「面を選択して合致させる」というロジックが部品ごとにハードコーディングされている。
これを解決するのが、クラスモジュールを使った「オブジェクト指向設計」です。
—
2. 拡張可能合致ビルダーの設計図
今回は「合致」を一つの機能単位(クラス)としてカプセル化します。これにより、メイン処理は「何と何を、どう合致させるか」を記述するだけのシンプルな構造になります。
【構成要素】
1. `MateBuilder` クラス: 合致作成の共通機能を保持。
2. `Main` モジュール: 業務ロジックを実行する司令塔。
—
3. 実装:洗練されたクラスモジュールの作成
まずは、`ClassMateBuilder` という名前でクラスモジュールを作成し、以下のコードを貼り付けてください。
‘ クラス名: ClassMateBuilder
Option Explicit
Private swApp As SldWorks.SldWorks
Private swModel As SldWorks.ModelDoc2
Private Sub Class_Initialize()
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
End Sub
‘ 汎用的な合致作成メソッド
Public Function AddMate(entity1 As Object, entity2 As Object, mateType As Long) As Boolean
Dim swMate As SldWorks.MateFeatureData
‘ セレクションのクリア
swModel.ClearSelection2 True
‘ エンティティを選択状態にする
entity1.Select4 False, Nothing
entity2.Select4 False, Nothing
‘ 合致の作成(簡易実装)
Dim bRet As Boolean
bRet = swModel.AddMate5(mateType, 0, False, 0, 0, 0, 0, 0, 0, 0, 0, False, False, False, 0, swMate)
AddMate = bRet
End Function
【ここがポイント!】
- `Class_Initialize`:インスタンス生成時に自動でモデルを取得。毎回 `Set` を書く必要がなくなります。
- `Select4` メソッド:`SelectByID2` は文字列ベースで不安定ですが、オブジェクトを直接渡す `Select4` を使うことで、堅牢性が飛躍的に向上します。
—
4. メイン処理:直感的な記述への変革
次に、標準モジュールでこのクラスを呼び出します。スパゲッティコードが、まるで対話をするようなコードに変わります。
Sub CreateAssembly()
Dim builder As New ClassMateBuilder
Dim swModel As SldWorks.ModelDoc2
Set swModel = Application.SldWorks.ActiveDoc
‘ 例:部品Aの面と部品Bの面を「一致」で合致させる
Dim faceA As Object, faceB As Object
‘ ここでは簡略化のため選択済みと仮定
Set faceA = swModel.SelectionManager.GetSelectedObject6(1, -1)
Set faceB = swModel.SelectionManager.GetSelectedObject6(2, -1)
‘ クラスを使って合致を実行
If builder.AddMate(faceA, faceB, swMateType_e.swMateCOINCIDENT) Then
Debug.Print “合致成功”
Else
MsgBox “合致に失敗しました”, vbCritical
End If
End Sub
—
5. 初学者が陥りやすい罠と対策
① 「選択」のタイミングが早すぎる
SolidWorksのAPIは「選択してから実行」が基本です。コードが速すぎて描画が追いつかない場合は、`swModel.ForceRebuild3 True` を挟むか、`DoEvents` で処理を待機させてください。
② オブジェクトの解放を忘れる
VBAはメモリ管理が緩い言語です。クラスモジュールを使用する際は、メイン処理の最後に必ず `Set builder = Nothing` を記述する癖をつけましょう。
—
先輩エンジニアからのアドバイス
コードを美しく保つ秘訣は、「自分が書いたコードを、半年後の自分が読んで理解できるか?」を基準にすることです。
今回紹介した「クラスベースの合致ビルダー」は、単にコードを綺麗にするだけではありません。今後「同心円合致」や「距離合致」を追加したくなったとき、`ClassMateBuilder` にメソッドを一つ増やすだけで済むようになります。
自動化とは、単なる作業の代行ではなく、「未来の自分へのプレゼント」です。
さあ、スパゲッティコードを卒業して、設計の美学を追求しましょう。何か詰まったら、いつでも聞いてくださいね。応援しています!
