【入門編】【上級プロ】マルチスレッド・非同期処理の模倣:長大なアセンブリ構築処理中に進捗バー(ProgressBar)を表示するUI実装 – SolidWorks VBA解析バイブル

スポンサーリンク

【SolidWorks VBA極意】数千部品のアセンブリを操る!プロ仕様の「進捗バー付き」自動生成術

こんにちは。SOLIDWORKSのAPI開発の世界へようこそ。
「マクロの記録」から卒業し、数分かかるような巨大なアセンブリ構築を自動化しようとすると、必ずぶつかる壁があります。それが「処理中のフリーズ問題」です。

画面が真っ白になり、SolidWorksが応答なしになる……。これではユーザーは不安でたまりませんよね。今回は、VBAのユーザーフォームを駆使して、まるでマルチスレッド処理のように「進捗状況をリアルタイムに表示する」プロフェッショナルの手法を伝授します。

—

1. なぜ「進捗表示」が難しいのか?

VBAは基本的に「シングルスレッド」です。つまり、マクロが計算や部品生成で忙しく動いている間、描画やクリックといった「UIの更新」は後回しにされます。

これを解決するための鍵は、`DoEvents`関数を適切に差し込むことです。これは「現在溜まっているOSの処理(画面の再描画など)を一度実行させる」という魔法の命令です。これを知るだけで、あなたのマクロは一気に「プロの道具」に進化します。

—

2. 実装の設計図:ユーザーフォームの準備

まずは進捗バー用のUIを構築しましょう。

1. VBE(Visual Basic Editor)を開く(Alt + F11)。
2. 挿入 > ユーザーフォーム を選択。
3. フォームに `Label` を配置し、名前を `lblProgress` に変更します。
4. フォーム上に `Frame` を配置し、その中に別の `Label`(背景色を青色にする)を配置します。これが進捗バー(`lblBar`)になります。

—

3. 実践コード:アセンブリ生成のエンジン

それでは、メインの処理コードを書いていきましょう。ここでは、部品をループで配置する処理を模した実装例を紹介します。

‘ メイン処理を実行する標準モジュール
Sub BuildAssemblyAutomated()
Dim swApp As SldWorks.SldWorks
Dim swAssy As SldWorks.AssemblyDoc
Dim i As Integer, totalParts As Integer

Set swApp = Application.SldWorks
Set swAssy = swApp.NewDocument(“アセンブリテンプレートのパス”, 0, 0, 0)

totalParts = 50 ‘ 今回の処理数

‘ 進捗フォームを表示(モーダルなしで表示するのがコツ)
Load UserForm1
UserForm1.Show vbModeless

For i = 1 To totalParts
‘ — ここに部品配置や合致(Mate)の処理を記述 —
‘ 例: swAssy.AddComponent6(…)

‘ 処理の重い計算の後に必ず差し込む
Call UpdateProgress(i, totalParts)

‘ SOLIDWORKSの描画を更新し、操作を受け付ける
DoEvents
Next i

Unload UserForm1
MsgBox “アセンブリ構築が完了しました!”
End Sub

‘ フォームを制御するサブルーチン
Public Sub UpdateProgress(current As Integer, total As Integer)
Dim percent As Double
percent = current / total

‘ 進捗バーの幅を変更(Frameの幅を最大とする)
UserForm1.lblBar.Width = UserForm1.Frame1.Width percent
UserForm1.lblProgress.Caption = “処理中: ” & Int(percent 100) & “%”

‘ 描画の強制更新
UserForm1.Repaint
End Sub

—

4. プロが教える「陥りやすい罠」と対策

① `vbModeless` の重要性

`UserForm1.Show` の後に `vbModeless` を付け忘れると、フォームが表示されている間、SolidWorks側を操作できなくなります。必ず「モードレス(非モーダル)」で呼び出してください。

② `DoEvents` の乱用は禁物

`DoEvents` は強力ですが、ループの回数が数万回に及ぶ場合、ループのたびに実行すると処理速度が著しく低下します。「10回に1回呼び出す」といった間引き処理を入れるのが、パフォーマンスを維持するエンジニアの気遣いです。

③ エラーハンドリングの欠如

アセンブリ構築中にファイルが見つからないなどのエラーが起きると、フォームが開きっぱなしになることがあります。

On Error GoTo Cleanup
‘ … 処理 …
Cleanup:
Unload UserForm1
‘ エラー処理

このように、`Cleanup` ラベルでフォームを確実に閉じる設計を徹底しましょう。

—

最後に:自動化の先にあるもの

いかがでしたか?`DoEvents` を使いこなし、進捗を可視化することで、あなたの作るマクロは単なる「作業短縮ツール」から「業務を円滑にするシステム」へと昇華します。

最初は難しく感じるかもしれませんが、この「ユーザー体験(UX)を意識した設計」ができるエンジニアは非常に貴重です。ぜひ、今日からあなたのコードにこの「命」を吹き込んでみてください。

ここをクリアすれば、あなたはもう立派なSOLIDWORKS API開発者です。応援していますよ!

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