SolidWorks VBAの「スパゲッティ」を断つ:オブジェクト指向によるパーツ生成の極致
SolidWorks APIを扱う現場で、数百行に及ぶプロシージャが並ぶ「手続き型コード」を目にしない日はありません。それがなぜ致命的なのか。APIの呼び出し順序、メモリの断片化、そしてフィーチャーツリーの複雑化。これらを制御できないコードは、いずれ必ず破綻します。
本稿では、レガシーなVBA環境であっても、「Class Module」によるカプセル化を徹底することで、保守性と再利用性を極限まで高める設計哲学を伝授します。
—
1. なぜ「手続き型」の自動化は失敗するのか
SolidWorksのAPIはCOMオブジェクトの集合体です。手続き型のコードでは、`swApp.ActiveDoc` を至る所で参照し、メモリ管理を怠り、エラーハンドリングを怠ります。結果として、実行のたびにメモリリークが発生し、フィーチャの生成順序が論理破綻を起こす。
真のエンジニアは、「SolidWorksのドキュメント」をひとつの「オブジェクト」として定義し、そのライフサイクルを厳格に管理することから始めます。
—
2. 核心設計:フィーチャ生成をカプセル化した `CFeatureBuilder`
単なるスクリプトではなく、フィーチャ生成を「サービス」として定義します。以下は、スケッチから押し出しフィーチャを生成するための、保守性を極めたクラス設計の雛形です。
Class Module: `CFeatureBuilder`
‘ ———————————————————
‘ Class: CFeatureBuilder
‘ 目的: フィーチャ生成の複雑性を隠蔽し、型安全な操作を提供する
‘ ———————————————————
Option Explicit
Private m_swApp As SldWorks.SldWorks
Private m_swModel As SldWorks.ModelDoc2
‘ 初期化時にモデルをバインドする
Public Sub Initialize(ByRef swApp As SldWorks.SldWorks, ByRef swModel As SldWorks.ModelDoc2)
Set m_swApp = swApp
Set m_swModel = swModel
End Sub
‘ カプセル化された押し出し生成
Public Function CreateExtrude(depth As Double, sketchName As String) As SldWorks.Feature
‘ 事前検証: モデルの存在確認と型の特定
If m_swModel Is Nothing Then Err.Raise 91, , “Model is not initialized.”
‘ フィーチャ生成処理
‘ 明示的な選択と生成ロジックをここに閉じ込める
Dim swFeat As SldWorks.Feature
Set swFeat = m_swModel.FeatureManager.FeatureExtrusion2(True, False, False, 0, 0, depth, depth, False, False, False, False, 0, 0, False, False, False, False, True, True, True, 0, 0, False)
Set CreateExtrude = swFeat
End Function
‘ クラス終了時のクリーンアップ
Private Sub Class_Terminate()
‘ 明示的な参照解除はVBAのメモリ管理において極めて重要
Set m_swModel = Nothing
Set m_swApp = Nothing
End Sub
—
3. シニアエンジニアが意識すべき「メモリの作法」
VBA環境において最も見落とされがちなのが、COMオブジェクトの寿命(ライフサイクル)です。
- `Nothing` の強制: ローカル変数で `Set swFeat = Nothing` を行うのは基本ですが、クラスの `Terminate` イベントで確実に上位参照を断ち切ってください。これを怠ると、SolidWorksプロセスが終了してもメモリにゴミが残り、次の実行時に予期せぬクラッシュを招きます。
- Windows APIによる高速化: 大量のアセンブリを操作する場合、`DoEvents` に頼り切るのは愚策です。`GetTickCount` や `QueryPerformanceCounter` などのWindows APIを組み合わせ、操作間のウェイトを最小限に制御する設計を取り入れてください。
—
4. 実装のベストプラクティス:メイン制御部
メインモジュールは「何をするか」というビジネスロジックに集中させます。「どう生成するか」という技術的な詳細はすべてクラスへ委譲します。
Sub Main()
Dim swApp As SldWorks.SldWorks
Set swApp = Application.SldWorks
Dim swModel As SldWorks.ModelDoc2
Set swModel = swApp.NewDocument(“Part”, 0, 0, 0)
‘ クラスによるカプセル化
Dim builder As New CFeatureBuilder
builder.Initialize swApp, swModel
‘ ビジネスロジック
On Error GoTo ErrorHandler
builder.CreateExtrude 0.05, “Sketch1”
Exit Sub
ErrorHandler:
MsgBox “Error: ” & Err.Description
End Sub
—
5. 結論:コードは「資産」である
あなたが書いたVBAコードは、ただの作業用スクリプトではありません。会社の設計ナレッジが凝縮された「資産」です。
1. カプセル化せよ: 実装の詳細をクラスに隠し、メインロジックを汚染しないこと。
2. 型を厳格にせよ: `Object` 型の使用は避け、`SldWorks.Feature` 等のインターフェースを明確に定義すること。
3. ライフサイクルを制御せよ: 常にメモリの状態を意識し、確実な解放を行うこと。
このアーキテクチャへの転換こそが、自動化エンジニアとしての「脱・初心者」の第一歩です。SolidWorks APIの深淵は、こうした規律あるコードの先にしかありません。
