【SolidWorks VBA極意】マクロ記録の呪縛を解く:真のパーツ生成と環境制御
多くのエンジニアがSolidWorks APIの入り口として「マクロの記録」を使う。しかし、記録されたコードは「操作の残骸」に過ぎない。もし君が、大規模な自動化システムや、数十万点のパーツを扱う統合管理環境の構築を志すのであれば、その「記録されたコード」は今すぐゴミ箱に捨てるべきだ。
本稿では、レガシーなVBA環境下であっても、プロフェッショナルとして恥ずかしくない、堅牢でメモリ効率を極めたパーツ生成の極致を伝授する。
—
1. マクロ記録が隠蔽する「テンプレートの罠」
マクロ記録機能は、ユーザーがクリックした座標や既存のテンプレートパスを「ハードコード」する。これでは別PCや環境差異のあるネットワークドライブで動作させた瞬間に破綻する。
我々が目指すべきは、「環境に依存しない構成」だ。`ISldWorks::NewDocument` を呼ぶ際、テンプレートパスを直接記述するのではなく、レジストリや設定ファイルから動的に解決するアーキテクチャが必要となる。
堅牢なパーツ生成のプロトタイプ
Option Explicit
‘ メモリリークを許さない。オブジェクト参照は必ずモジュールレベルで管理するか、スコープを最小化する
Public Sub CreateNewPartOptimized()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim templatePath As String
Set swApp = Application.SldWorks
‘ テンプレートパスの取得(本来は外部設定ファイルから読み込むべき)
templatePath = swApp.GetUserPreferenceStringValue(swUserPreferenceStringValue_e.swDefaultTemplatePart)
‘ ドキュメント生成:戻り値を明示的にModelDoc2で受け、制御を握る
Set swModel = swApp.NewDocument(templatePath, 0, 0, 0)
If swModel Is Nothing Then
Err.Raise vbObjectError + 1001, “System”, “ドキュメント作成に失敗しました。”
End If
‘ 単位系(mmgs)の強制適用
‘ システム設定に依存せず、プログラムの意図を貫徹する
swModel.Extension.SetUserPreferenceInteger swUserPreferenceIntegerValue_e.swUnitSystem, 0, swUnitSystem_e.swUnitSystem_MMGS
‘ オブジェクトの明示的解放(VBAにおいてはNothingへの代入が鉄則)
Set swModel = Nothing
Set swApp = Nothing
End Sub
—
2. メモリ最適化と「COMの寿命」の制御
SolidWorks APIはCOMベースである。VBAにおいて最も恐ろしいのは、循環参照や解放忘れによる「見えないプロセス(SLDWORKS.exeのゾンビ化)」だ。
- Setの徹底: `Set swModel = Nothing` を怠ることは、大規模処理においてメモリリークを招き、24時間稼働の自動化サーバーを数日でダウンさせる原因となる。
- イベントの切断: もしクラスモジュールでイベントハンドラを実装しているなら、`Terminate` イベントで必ず `WithEvents` を解除せよ。
—
3. レガシー環境とWindows APIの「影」
時には、SolidWorksの標準APIでは手の届かない領域に触れる必要がある。例えば、ファイルダイアログの表示位置の制御や、ウィンドウの最前面固定などだ。
Windows API (`user32.dll`) を呼び出す際は、必ず `PtrSafe` 属性を付与し、64bit環境での動作を保証せよ。これはエンジニアとしての最低限のたしなみである。
If VBA7 Then
‘ 64bit VBA用の宣言
Private Declare PtrSafe Function SetForegroundWindow Lib “user32” (ByVal hwnd As LongPtr) As Long
Else
‘ レガシー32bit用
Private Declare Function SetForegroundWindow Lib “user32” (ByVal hwnd As Long) As Long
End If
—
4. チーフアーキテクトからの提言
君たちがこれから書くコードは、単なる「マクロ」ではない。それは将来的に製品設計の根幹を支える「自動化基盤」の一部となる可能性がある。以下の3点を常に意識してほしい。
1. エラーハンドリングの徹底: `On Error Resume Next` を多用してエラーを握りつぶすな。`Err.Raise` を使い、異常系を呼び出し元に正確に伝播させる設計を組め。
2. 定数化の徹底: マジックナンバー(`0`, `1`, `2`など)は徹底排除せよ。必ず列挙型(`Enum`)を使用し、コードの可読性と保守性を担保すること。
3. システム間連携: パーツ作成のトリガーは、Excelからではなく、データベース(SQL Server等)やJSON設定ファイルから受け取れるように疎結合に設計せよ。
記録されたコードをただ「再生」するだけの時代は終わった。これからは、APIの内部構造を理解し、SolidWorksを君の意のままに操るエンジニアだけが、生産性の頂点に立つことができる。
次は、`ISldWorks::FeatureManager` を駆使した、動的なフィーチャ生成の深淵について語るとしよう。準備はいいか?
