SolidWorks VBAの深淵:Early Bindingこそがエンジニアの矜持である
SolidWorksの自動化において、コードの「書きやすさ」と「実行速度・堅牢性」はしばしばトレードオフの関係にあると誤解されている。しかし、真のアーキテクトにとって、それは選択の問題ではない。Late Binding(遅延バインディング)による開発は、プロフェッショナルが犯すべきではない怠慢である。
本稿では、なぜ今さら「参照設定」と「Early Binding」に回帰すべきなのか、その技術的根拠と、システムを極限まで加速させるためのメモリ管理術を解説する。
—
1. なぜLate Bindingを捨て去るべきなのか
多くのエンジニアが `CreateObject(“SldWorks.Application”)` を好むのは、参照設定の煩雑さから逃れられるからだ。だが、それは「型」という強力な武器を放棄しているに等しい。
Late Bindingの罪
- コンパイル時のチェック不能: 実行するまでメンバの存在が確認できない。
- パフォーマンスの劣化: 実行時にIDispatchを介したメンバ解決が行われ、数千回のフィーチャ操作を行うループでは致命的なオーバーヘッドとなる。
- IntelliSenseの喪失: 膨大なSW APIのメソッドを暗記している人間など存在しない。補完機能のない開発は、暗闇で針に糸を通すようなものだ。
Early Binding(早期バインディング)は、プロジェクト設定で `SolidWorks 20xx Type Library` を参照するだけで、コンパイル時にメモリレイアウトを確定させ、爆速のメソッド呼び出しを実現する。これは現代のエンジニアリングにおける最低限の作法である。
—
2. 鋼鉄のコード:Early Bindingによる実装例
以下のコードは、パーツ作成のベストプラクティスを凝縮したテンプレートである。
Option Explicit ‘ 全ての変数を強制的に宣言する。これは安全の第一歩である。
‘ 参照設定: SolidWorks 20xx Type Library
‘ 参照設定: SolidWorks 20xx Constant Type Library
Public Sub CreateHighPerformancePart()
‘ 型を明示することで、コンパイル時にオブジェクトのメモリ構造が確定する
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swPart As SldWorks.PartDoc
‘ プロセス間通信を最小化するため、既存のインスタンスを拾う
Set swApp = Application.SldWorks
If swApp Is Nothing Then
Err.Raise vbError, “Main”, “SolidWorksが起動していません。”
End If
‘ 新規ドキュメントの生成
Set swModel = swApp.NewDocument(“C:\ProgramData\SolidWorks\…\Part.prtdot”, 0, 0, 0)
Set swPart = swModel
‘ 描画の抑制(最重要:画面更新を止めるだけで速度は数倍になる)
swApp.Frame.KeepAlive = True
swModel.Visible = False
‘ ここにフィーチャ生成ロジックを記述
‘ …
‘ 終了処理: メモリ解放の徹底
‘ 循環参照を防ぐため、親オブジェクトから順にNothingを代入する
Set swPart = Nothing
Set swModel = Nothing
Set swApp = Nothing
End Sub
—
3. パフォーマンスを極限まで引き出す「隠し味」
コードが正しく動くのは当然だ。我々が目指すべきは、その先にある「実行時間の短縮」である。
① 画面更新と再構築の制御
`swApp.BatchMode = True` や `swModel.FeatureManager.EnableFeatureTree = False` を活用せよ。フィーチャを一つ作成するたびにSolidWorksが再計算(Rebuild)を行うのはリソースの無駄遣いだ。全てのロジックが終わった後に一度だけ `ForceRebuild3` を呼ぶのが定石である。
② Windows APIによるプロセス制御
大規模なアセンブリ操作を行う際、SolidWorksのメモリ使用量が限界に達することがある。`SetProcessWorkingSetSize` をWin32 APIで呼び出し、メモリの空き領域を動的に整理することで、長時間のバッチ処理におけるクラッシュを防ぐことができる。
If VBA7 Then
Private Declare PtrSafe Function SetProcessWorkingSetSize Lib “kernel32” _
(ByVal hProcess As LongPtr, ByVal dwMinimumWorkingSetSize As LongPtr, _
ByVal dwMaximumWorkingSetSize As LongPtr) As Long
End If
—
4. 伝説のアーキテクトからの提言
VBAはレガシーと言われるが、SolidWorksの内部で完結するタスクにおいて、これほど効率的なツールは他にない。
1. Option Explicitを外すな: 型の曖昧さは、将来のバグという名の借金を重ねているに過ぎない。
2. オブジェクトを溜め込むな: `Set = Nothing` はおまじないではない。COMオブジェクトの参照カウントを正しく管理することは、メモリリークを撲滅するための神聖な儀式である。
3. エラーハンドリングの徹底: `On Error Resume Next` でエラーを隠蔽するエンジニアに未来はない。必ず明確なトラップを仕掛け、異常終了時にリソースが残らないようにせよ。
このコードを書き終えたとき、君のSolidWorksはただのCADから、君の意思を忠実に実行する「自動化エンジン」へと変貌を遂げるはずだ。現場の壁を打ち破るための、最高のコードを書いてほしい。
