SolidWorks VBAの「脱・素人」:ListViewで構築する堅牢なBOMプレビューUI
多くのエンジニアがSolidWorks VBAで躓くのは、`MsgBox`や`InputBox`といった標準UIの限界に直面した時だ。特にアセンブリ構造の解析やBOMデータの確認において、情報過多なログを吐き出すだけのスクリプトは、もはや「自動化」ではなく「ノイズ」である。
今回は、VBAのUserFormにMicrosoft Windows Common Controls(ListView)を実装し、アセンブリ構造を直感的に操作・編集するための「プロフェッショナルなUIアーキテクチャ」を伝授する。
—
1. なぜ「ListView」を選択するのか?
標準の`ListBox`では、多列表示やヘッダーによるソートが不可能だ。実務において、部品番号、数量、材料、質量を並列表示できないBOM確認ツールは、視認性が低く誤操作の温床となる。
`ListView`はCOMコンポーネントとしてWindowsに深く根ざしており、メモリ効率と描画性能においてVBAとの相性が極めて良い。ただし、扱いには一点だけ注意が必要だ。「Late Binding(遅延バインディング)」を意識した設計を行わないと、異なる環境での動作が極端に不安定になる。
2. ListView実装の黄金律:環境依存を排除せよ
VBAで外部コントロールを扱う際、参照設定(Ref)に頼りすぎると、PCを入れ替えるたびに「コンパイルエラー」の嵐に見舞われる。以下の設計指針を徹底してほしい。
1. Late Bindingの徹底: プログラム実行時にオブジェクトを生成する。
2. イベントハンドラの分離: UIのロジックとSolidWorksのAPI呼び出しを明確に分離する(疎結合)。
プロダクションコード例:ListViewの初期化とデータ挿入
まずは、UserFormの初期化処理を最適化する。
‘ UserForm_Initialize内での初期化ロジック
Private Sub UserForm_Initialize()
With ListView1
.View = lvwReport ‘ レポート形式(リストビュー)
.FullRowSelect = True
.Gridlines = True
‘ カラムヘッダーの定義
.ColumnHeaders.Add , , “部品名”, 100
.ColumnHeaders.Add , , “数量”, 50
.ColumnHeaders.Add , , “材料”, 80
End With
‘ データ読み込みの呼び出し
LoadAssemblyData
End Sub
‘ SolidWorks APIを使用してアセンブリを解析する核心部
Private Sub LoadAssemblyData()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swAssy As SldWorks.AssemblyDoc
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
If swModel.GetType <> swDocASSEMBLY Then Exit Sub
‘ コンポーネントの走査(再帰処理が好ましいが、ここでは簡略化)
Dim vComps As Variant
vComps = swModel.GetComponents(False)
Dim i As Long
For i = 0 To UBound(vComps)
Dim swComp As SldWorks.Component2
Set swComp = vComps(i)
‘ ListViewへのデータ追加
Dim itm As ListItem
Set itm = ListView1.ListItems.Add(, , swComp.Name2)
itm.SubItems(1) = “1” ‘ 仮の値
itm.SubItems(2) = “SS400” ‘ APIからプロパティ取得を推奨
Next i
End Sub
—
3. 設計の勘所:堅牢なUIにするための3つの鉄則
① オブジェクトのライフサイクルを管理する
`SldWorks`オブジェクトをループ内で毎回取得してはならない。必ず変数のスコープを意識し、一度取得した参照は使い回す。特に大規模アセンブリの場合、ループ内での`GetObject`はパフォーマンスを致命的に低下させる。
② エラーハンドリングの「逃げ道」を作らない
ユーザーがBOM編集中にモデルを閉じる可能性がある。`On Error GoTo`でエラーを握りつぶすのではなく、`swApp.ActiveDoc`がNothingでないか、型が正しいかを常にチェックする「Guard Clause(ガード節)」を導入せよ。
③ データベース(Excel/SQL)連携時のタイムアウト回避
BOM情報を外部ファイルへ書き出す際は、UIのフリーズを防ぐために`DoEvents`を適切に挟むこと。しかし、`DoEvents`の乱用は再帰呼び出しによるスタックオーバーフローを招く。UIの更新タイミングを制御し、ユーザーに「処理中」であることが伝わるプログレスバーを併用するのが、プロの仕事だ。
—
結論:ツールは「道具」ではなく「意志」である
今回紹介したListViewを用いたUI構築は、単なる見た目の改善ではない。「エンジニアがSolidWorksのデータ構造をどう解釈しているか」を可視化するインターフェースだ。
コードをコピペして動かすことは容易い。だが、真に価値があるのは「なぜこの設計にしたのか」という背景を理解し、現場の過酷な設計変更に耐えうるコードへと昇華させることにある。
君たちが作るツールが、設計現場の数千時間の無駄を削ぎ落とす武器になることを期待している。次回の記事では、このListView上で直接データを編集し、SolidWorksのカスタムプロパティへ一括書き込みを行う「双方向同期」の技術について踏み込む。準備はいいか。
