SolidWorks VBAの限界を超えろ:UserForm×ListViewで構築する「次世代BOMプレビュー」の極意
こんにちは。SolidWorksの世界で自動化を極めようとするあなたへ。
「マクロの記録」ボタンを押して、生成された無機質なコードを眺める段階はもう卒業しましょう。SolidWorksの真の力は、APIオブジェクトモデルを理解し、「ユーザーが直感的に操作できるインターフェース」を構築した瞬間に解き放たれます。
今回は、標準の`MsgBox`や`InputBox`といった「旧時代の遺物」を捨て、`ListView`コントロールを活用したリッチなBOM(部品表)プレビュー画面を構築する技術を伝授します。
—
1. なぜ「ListView」なのか?―APIアーキテクトの視点
SolidWorks APIは強力ですが、標準の出力インターフェースは貧弱です。アセンブリ構造を解析し、それをユーザーに提示する際、単なるログ出力では情報の階層性や個別編集の利便性が損なわれます。
`ListView`を使えば、以下のことが可能になります。
- 階層構造の視覚化: 部品名、構成部品番号、質量などを列ごとに整理。
- 個別編集: セルを選択して数値を書き換えるような操作感を実現。
- イベント駆動: クリック一つで該当部品をSolidWorks上でハイライト(選択)するなどの連動が可能。
—
2. 環境構築:コントロールの呼び出し方
まず、VBAエディタでUserFormを挿入してください。次に、ツールボックスを右クリックし、「追加のコントロール」から以下を選択します。
- Microsoft ListView Control 6.0 (SP6)
※もしリストにない場合は、OSのビット数(32bit/64bit)に応じた`MSCOMCTL.OCX`の登録が必要です。ここが最初の難関ですが、乗り越えれば景色が変わります。
—
3. 実装コード:アセンブリ構造をListViewへ流し込む
まずは、アセンブリからコンポーネントを再帰的に取得し、`ListView`へ流し込む基本ロジックを解説します。
‘ 必要なオブジェクトの宣言
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
‘ UserFormの初期化イベント
Private Sub UserForm_Initialize()
‘ ListViewの設定
With ListView1
.View = lvwReport ‘ レポート形式(表形式)
.FullRowSelect = True
.Gridlines = True
‘ カラムの追加
.ColumnHeaders.Add , , “部品名”, 100
.ColumnHeaders.Add , , “設定名”, 80
.ColumnHeaders.Add , , “質量(g)”, 60
End With
Call LoadBomData
End Sub
Private Sub LoadBomData()
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
‘ アセンブリのルートコンポーネントを取得
Dim swAssy As SldWorks.AssemblyDoc
Set swAssy = swModel
Dim swRootComp As SldWorks.Component2
Set swRootComp = swAssy.GetRootComponent
‘ 再帰的にコンポーネントを走査するプロシージャへ渡す
TraverseComponents swRootComp
End Sub
‘ 再帰的に子部品を抽出する関数
Private Sub TraverseComponents(swComp As SldWorks.Component2)
Dim vChildren As Variant
vChildren = swComp.GetChildren
Dim i As Integer
For i = 0 To UBound(vChildren)
Dim swChild As SldWorks.Component2
Set swChild = vChildren(i)
‘ ListViewに行を追加
Dim itm As ListItem
Set itm = ListView1.ListItems.Add(, , swChild.Name2)
itm.SubItems(1) = swChild.ReferencedConfiguration
itm.SubItems(2) = swChild.GetModelDoc2.GetMassProperties(0)(5) ‘ 簡易的な質量取得
‘ 子部品があればさらに再帰
TraverseComponents swChild
Next i
End Sub
—
4. 陥りやすい罠とアーキテクトからの助言
① 「再帰呼び出し」のスタックオーバーフロー
アセンブリが巨大になると、`TraverseComponents`が深くなりすぎてエラーになることがあります。実務では、必ず`swChild`が`Nothing`ではないか、そして「隠しコンポーネント」や「アセンブリ内アセンブリ」の例外処理を挟むことを忘れないでください。
② パフォーマンスの重み
`ListView`に数千個の部品を追加すると、描画処理でフリーズします。
- 解決策: データを更新する際は `ListView1.Visible = False` にして描画を停止させ、全追加後に `True` に戻すのがエンジニアの常識です。
③ 選択の同期
ListViewの `ItemClick` イベントで `swModel.Extension.SelectByID2` を呼び出せば、リストをクリックするだけでSolidWorks上の部品がパッと光ります。これこそが、ユーザーが「自分の手で操作している」と実感できるUIの極みです。
—
最後に:自動化の先にあるもの
今回学んだ「UIの近代化」は、単なる見た目の改善ではありません。「情報とSolidWorksをダイレクトに結びつける」という自動化エンジニアとしての設計思想の表れです。
まずはこのコードをコピーして、自分の手元のアセンブリで動かしてみてください。画面が立ち上がり、アセンブリの部品がリストとなって現れた瞬間、あなたはもう「マクロを記録する人」ではなく、「SolidWorksのUIを再定義する開発者」になっています。
分からないことがあれば、いつでも聞いてください。次は、このリストからの「一括プロパティ編集機能」の実装に挑戦しましょうか。
あなたのコードが、現場の誰かの時間を劇的に短縮することを願っています。
