SolidWorks VBAを掌握する:UserFormによる「現場直結型」UI構築の真髄
設計現場における自動化ツールにおいて、最も軽視されがちなのが「UI(ユーザーインターフェース)」だ。多くのエンジニアは黒いVBAエディタで完結させようとするが、それは「設計者がマクロに合わせる」という本末転倒な状況を生む。
真に現場で愛されるツールとは、「直感的であり、かつ誤操作を許さないUI」を備えているものだ。今回は、SolidWorks APIを叩くための「UserFormによる操作パネル」の設計思想と、プロダクションレベルの堅牢な実装について伝授する。
—
1. なぜ「モーダル表示」が重要なのか
UserFormを設計する際、`UserForm.Show` の引数に注目したことはあるか?
‘ 悪い例:親ウィンドウが操作可能なまま放置される
UserForm1.Show vbModeless
‘ 良い例:操作をUIに強制する
UserForm1.Show vbModal
設計作業中のエンジニアは多忙だ。`vbModeless`(非モーダル)でダイアログを浮かべると、SolidWorksの操作とマクロの操作が混在し、予期せぬAPIエラーやメモリの競合を引き起こす。「入力を完了させるまでSolidWorksを触らせない」というモーダル設計こそが、エラーを未然に防ぐ最強のガードレールとなる。
—
2. 実践:堅牢な「プロパティ一括更新」パネル
現場でそのまま使える、堅牢な設計のテンプレートを提示する。このコードの肝は「エラーハンドリングの徹底」と「オブジェクトの寿命管理」だ。
UserForm内のコード (UIロジック)
Option Explicit
‘ UI側では直接APIを叩かず、コントローラ層へ処理を投げる設計にする
Private Sub btnExecute_Click()
Dim controller As New MacroController
‘ 入力値のバリデーション
If Me.txtPartNumber.Value = “” Then
MsgBox “部品番号を入力してください”, vbCritical
Exit Sub
End If
‘ 実行
If controller.UpdateCustomProperty(Me.txtPartNumber.Value) Then
MsgBox “更新完了”, vbInformation
Unload Me
Else
MsgBox “更新に失敗しました”, vbCritical
End If
End Sub
標準モジュール (API制御層)
Option Explicit
Public Function UpdateCustomProperty(val As String) As Boolean
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
‘ Set swApp = Application.SldWorks が基本だが、
‘ オブジェクトの生存確認を常に行うのがプロの流儀
Set swApp = GetObject(, “SldWorks.Application”)
Set swModel = swApp.ActiveDoc
If swModel Is Nothing Then Exit Function
‘ Undoスタックを考慮したトランザクション処理
swModel.Extension.CustomPropertyManager(“”).Add2 “PartNo”, swCustomInfoText, val
UpdateCustomProperty = True
End Function
—
3. 現場で「死なない」ための3つの鉄則
① データベース(外部ファイル)連携の注意点
CSVやExcelをDB代わりにする場合、必ず「排他制御」を考慮せよ。複数の設計者が同時にマクロを叩くと、ファイルがロックされマクロがクラッシュする。
- 対策: `Open #1 For Binary Lock Read Write` を使用し、ファイルが開けるか確認してから処理を開始する「疎結合な設計」を心がけること。
② モデルのコンテキストを常に監視せよ
`swApp.ActiveDoc` を安易に信用するな。マクロ実行中にユーザーがウィンドウを切り替えたらどうなる?
- 対策: 処理の直前で `swModel` が `Nothing` でないか、また、それが正しいドキュメントタイプ(Part/Assembly/Drawing)であるかを確認する `If swModel.GetType <> swDocPART Then` といったガード節を必ず入れる。
③ オブジェクト解放の徹底
VBAはガベージコレクションが弱い。特に `SldWorks` オブジェクトを長時間保持すると、メモリリークの温床になる。
- 対策: 処理が終わったら `Set swModel = Nothing` を明示的に呼び出し、参照を切る癖をつけろ。
—
結論:UIは「対話」である
優れたUIは、ユーザーに対して「今は何ができるか」「何が起きたか」を明確に伝える。今回紹介したUserFormによるパネル構築は、単なる見た目の変更ではない。あなたのコードという「ブラックボックス」に対して、安全な入り口を設ける行為なのだ。
明日からの開発では、まず「ボタン」を置く前に、「ユーザーが間違った操作をしたとき、どう止めるか」を設計してほしい。それが、世界最高峰の自動化エンジニアへの第一歩だ。
コードは、常に「読み手(未来の自分)」と「使い手(現場の仲間)」へのラブレターであれ。健闘を祈る。
