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

スポンサーリンク

【SolidWorks API】数千部品の地獄を可視化せよ:進捗バーを実装する「非同期模倣」の極意

SolidWorks APIを用いたアセンブリ自動構築。数分かかる処理の最中、画面がフリーズし「SolidWorksが応答していません」と表示される…そんな開発者としての未熟さを晒すのは今日で終わりにしよう。

VBAはシングルスレッドだ。だが、「進捗を更新する」という目的においては、非同期処理を模倣する知的なアプローチが存在する。 今回は、長大なアセンブリ構築処理をユーザーに可視化し、UXを劇的に向上させるための「堅牢なUI設計」を伝授する。

—

1. なぜ「DoEvents」だけでは不十分なのか

初心者は単純にループ内で `DoEvents` を叩くが、これだけでは不十分だ。なぜか?

  • イベントの飽和: `DoEvents` を過剰に叩くと、OSがSolidWorksの描画更新よりもメッセージ処理を優先し、逆に処理速度が低下する。
  • 再入問題: 処理中にユーザーが「閉じる」ボタンを押せば、メモリリークや未定義状態のアセンブリが生成される。

プロの鉄則: 「進捗更新は一定の閾値(例えば1%ごと)でのみ行い、ユーザーフォームは『モードレス』で開き、かつ『キャンセルフラグ』を厳格に管理する」ことだ。

—

2. 実装:プロフェッショナルなUI制御コード

まずはユーザーフォーム(`frmProgress`)を作成し、`ProgressBar` コントロールを配置してほしい。

ユーザーフォーム側のコード(frmProgress)

フォームは「キャンセル」の受け口に特化させる。

‘ フォームモジュール:frmProgress
Public CancelFlag As Boolean

Private Sub btnCancel_Click()
CancelFlag = True
Me.Hide
End Sub

‘ 呼び出し元からUIを更新するためのメソッド
Public Sub UpdateProgress(ByVal percent As Double, ByVal status As String)
Me.ProgressBar.Value = percent
Me.lblStatus.Caption = status
DoEvents ‘ ここで描画更新を強制する
End Sub

標準モジュール側の処理(メインエンジン)

ここが、数千部品のアセンブリを制御する心臓部だ。

Public Sub BuildAssemblyAutomated()
Dim swApp As SldWorks.SldWorks
Dim swAssy As SldWorks.AssemblyDoc
Dim progressUI As New frmProgress

Set swApp = Application.SldWorks

‘ モードレスでフォームを表示(これで処理が止まらない)
progressUI.Show vbModeless

Dim totalParts As Long: totalParts = 100 ‘ 例として100パーツ
Dim i As Long

For i = 1 To totalParts
‘ 1. キャンセルチェック(必須)
If progressUI.CancelFlag Then
MsgBox “処理が中断されました。”, vbCritical
Unload progressUI
Exit Sub
End If

‘ 2. アセンブリ構築の重い処理
‘ swAssy.AddComponent6(…) 等

‘ 3. 進捗更新(頻度を調整してパフォーマンスを維持)
If i Mod 5 = 0 Then
progressUI.UpdateProgress (i / totalParts) 100, “部品 ” & i & ” を追加中…”
End If
Next i

Unload progressUI
MsgBox “構築完了!”, vbInformation
End Sub

—

3. 現場で生き残るための「3つの設計哲学」

① 「モードレス表示」の罠を回避せよ

`vbModeless` でフォームを表示すると、ユーザーがSolidWorksの他の操作を行えてしまう。これを防ぐには、処理開始時に `swApp.UserControl = False` を指定し、外部操作を一時的にロックするのが最も確実だ。

② ファイルI/Oのボトルネックを排除せよ

数千部品を読み込む際、最も遅いのは「ファイルを開く」というOSの挙動だ。

  • 解決策: すべてのファイルを `swApp.OpenDoc6` でバックグラウンドで開く前に、ファイルパスの存在チェックを事前に行え。実行時のファイル不在エラーは、自動化ツールの最大の恥だ。

③ データベース連携のトランザクション管理

もしExcelやSQL Serverから部品データを取得しているなら、「1パーツ追加ごとに通信するな」。最初に全データを配列に格納し、メモリ上で処理せよ。APIの呼び出し回数が減れば、体感速度は数倍に跳ね上がる。

—

結論:エンジニアの品格

「動けばいいコード」を書くのはアマチュアだ。
長大な処理を回すとき、ユーザーは「今、何が起きているのか」「いつ終わるのか」「失敗していないか」という不安と戦っている。進捗バーは単なるグラフィックではなく、システムとユーザーを結ぶ「信頼の架け橋」である。

このコードをベースに、あなたの現場の要件に合わせて拡張してほしい。堅牢なエラーハンドリングと、ユーザーへの敬意があれば、あなたの作成する自動化ツールは、現場で愛され続ける「伝説のツール」になるはずだ。

さあ、コードを書け。SolidWorksをあなたの思い通りに操るために。

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