【入門編】【ユーザーインターフェース(UI)の近代化】UserFormとListViewコントロールを組み合わせたリッチなBOMプレビュー – SolidWorks VBA解析バイブル

スポンサーリンク

こんにちは!SolidWorks自動化の現場で日々奮闘している君なら、一度はこんな壁にぶつかったことがあるはずです。

「マクロの記録で部品表(BOM)を吐き出すことはできたけれど、結果を味気ないメッセージボックスやExcelのセルにズラズラ並べるだけで終わっている……。もっとこう、モダンなアプリみたいに、画面上でツリーやリストを見ながらポチポチ操作できたらカッコいいのに!

そう、標準のMsgBoxやInputBoxだけでは、現代の複雑な設計業務をスマートにアシストすることはできません。
今回は、VBAの標準機能であるUserFormと、Windowsの強力なUI部品であるListViewコントロールを組み合わせ、SolidWorks上でリッチな「BOM(部品表)プレビューUI」を構築する方法を、チーフアーキテクトの私から直々に伝授しましょう!

ここをクリアすれば、君の作ったマクロは「ただの自動化スクリプト」から「洗練されたエンジニアリングツール」へと劇的に進化します。さあ、一緒にモダンなUIの世界へ飛び込みましょう!

1. なぜ「UserForm + ListView」なのか?

SolidWorks VBAの醍醐味は、3Dモデルのデータを自由自在に抽出・制御できる点にあります。しかし、抽出した数千点の部品データをユーザーに確認してもらう際、Excelを裏で立ち上げたり、ただの文字の羅列で見せたりするのはナンセンスです。

  • ListViewコントロールの魅力:
  • Excelのような「表形式(グリッド)」でデータを美しく整列できる。
  • カラム(列)ヘッダーをクリックしてソート(並べ替え)ができる。
  • 行を選択(ハイライト)して、そのデータを即座にVBA側へ渡せる。

このUIを自分の手で作り込めるようになると、マクロの使い勝手が何段階も跳ね上がります。

2. 開発の全体像とステップ

今回の実装の流れは以下の通りです。

1. 環境の確認: 64bit環境でのListViewの扱い方を知る。
2. UIの構築: VBAのVBE(Visual Basic Editor)でUserFormをデザインし、ListViewを配置する。
3. データ抽出ロジック: SolidWorksのアセンブリから、部品名や構成部品の情報を取得する。
4. イベントと連携: フォーム上のボタンを押したら、SolidWorks側で何らかの処理(例:選択した部品のハイライト)を行う。

3. 実践:リッチなBOMプレビューUIを作ろう

ステップ1:UserFormの準備とListViewの配置

まず、VBEを開き、新しい「UserForm」を挿入します(フォーム名を `BOMViewerForm` とします)。

※もしツールボックスに「ListView」が見当たらない場合は、ツールボックスの何もないところで右クリック >「その他のコントロール」から 「Microsoft ListView Control, version 6.0 (SP6)」 にチェックを入れてください。

フォーム上に以下のコントロールを配置します。

  • ListViewコントロール(名前:`lstBOM`)
  • プロパティ設定: `View = lvwReport`(詳細表示モードにする)、`GridLines = True`(グリッド線を表示)、`FullRowSelect = True`(行全体を選択可能にする)
  • CommandButton(名前:`btnClose`、キャプション:「閉じる」)

ステップ2:フォーム側のコード(UI制御)

`BOMViewerForm` のコードウィンドウを開き、以下のコードを貼り付けます。ここでは、ListViewの初期化とカラム(列)の設定を行っています。

‘ =================================================================
‘ フォームモジュール: BOMViewerForm
‘ =================================================================
Option Explicit

‘ フォーム初期化時の処理
Private Sub UserForm_Initialize()
‘ ListViewのカラム(列)を設定する
With Me.lstBOM
.View = lvwReport
.GridLines = True
.FullRowSelect = True

‘ カラムの追加 (見出し, 幅)
.ColumnHeaders.Add , “ColNo”, “No.”, 40
.ColumnHeaders.Add , “ColPartName”, “部品名”, 150
.ColumnHeaders.Add , “ColConfig”, “コンフィギュレーション”, 130
.ColumnHeaders.Add , “ColPath”, “ファイルパス”, 250
End With

‘ BOMデータを読み込むメイン処理を呼び出す
Call LoadBOMData
End Sub

‘ アクティブなSolidWorksアセンブリからBOMデータを取得し、ListViewに流し込む
Public Sub LoadBOMData()
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 Is Nothing Then
MsgBox “アクティブなドキュメントがありません。”, vbExclamation, “エラー”
Unload Me
Exit Sub
End If

If swModel.GetType <> swDocASSEMBLY Then
MsgBox “この機能はアセンブリドキュメントでのみ使用できます。”, vbExclamation, “エラー”
Unload Me
Exit Sub
End If

Set swAssy = swModel

‘ 構成部品の取得(簡易的にトップレベルの部品を取得する例)
Dim vComps As Variant
vComps = swAssy.GetComponents(True) ‘ True = トップレベルのみ

If IsEmpty(vComps) Then Exit Sub

Dim i As Long
Dim swComp As SldWorks.Component2
Dim listItem As ListItem

Me.lstBOM.ListItems.Clear

For i = LBound(vComps) To UBound(vComps)
Set swComp = vComps(i)

‘ 仮想部品などの除外処理(安全対策)
If Not swComp Is Nothing Then
‘ リストビューに行を追加
Set listItem = Me.lstBOM.ListItems.Add(, , CStr(i + 1)) ‘ No.
listItem.SubItems(1) = swComp.Name2 ‘ 部品名
listItem.SubItems(2) = swComp.ConfigurationName ‘ コンフィギュレーション
listItem.SubItems(3) = swComp.GetPathName ‘ ファイルパス
End If
Next i
End Sub

‘ 閉じるボタン
Private Sub btnClose_Click()
Unload Me
End Sub

4. 外部標準モジュールからの起動

フォームを呼び出すためのプロシージャを、通常の「標準モジュール(Module1など)」に記述します。

‘ =================================================================
‘ 標準モジュール: MainModule
‘ =================================================================
Option Explicit

Sub ShowBOMViewer()
Dim myForm As BOMViewerForm
Set myForm = New BOMViewerForm

‘ モーダル形式でフォームを表示
myForm.Show
End Sub

これで準備は完了です!SolidWorksでアセンブリモデルを開いた状態で `ShowBOMViewer` を実行してみてください。
見慣れた無機質なメッセージボックスではなく、綺麗に整列されたリスト形式のBOMプレビュー画面がポップアップするはずです。

5. 現場で役立つ!プロのチップスと陥りやすい罠

ここで、実務で必ず直面する「落とし穴」と、それを回避するためのプロの知見をいくつか共有しておきます。

⚠️ 注意点1: 64bit環境におけるListViewの互換性問題

現代のPC環境(64bit版SolidWorks & 64bit版Office)では、古いMicrosoft Common Controls (MSCOMCTL.OCX) が原因で「オブジェクトを読み込めません」というエラーが発生することがあります。
もしこのエラーに遭遇した場合は、PCに適切なOCXが登録されているか確認するか、代替として標準の `ListBox` コマンドで複数列をエミュレートする手法をとることも検討してください。(※今回は最も一般的なListViewの導入を前提として解説しています)

💡 知見2: 選択連動(セレクション・シンクロナイゼーション)の魔法

さらに高度なUIにするなら、ListView上の行をクリックしたときに、SolidWorks側の3Dビューでも該当の部品がパッとハイライトされる機能を実装すると、ユーザービリティが爆発的に向上します。
ListViewの `ItemClick` イベントを拾い、そこに `swModel.Extension.SelectByID2` などのAPIを組み合わせるだけで、それはもう「市販の専用アドインソフト」のような挙動になります。

最後に:ここをクリアすれば、君のVBAスキルは本物だ

今回は、UserFormとListViewを組み合わせたリッチなBOMプレビューの構築方法を解説しました。

「マクロの記録」をただ再生するだけのステージから、「ユーザーが快適に操作できるアプリケーション」を設計するステージへ。この境界線を越えたとき、君は単なる「マクロが書ける人」から、現場をリードする「業務自動化エンジニア」へと生まれ変わっています。

ここをクリアすれば、SolidWorks VBAの基本はバッチリです!
ぜひ自分の環境でもコードを組み込み、自由にカスタマイズしてみてくださいね。それでは、次回の開発現場でお会いしましょう!

タイトルとURLをコピーしました