SolidWorks VBAの「暴走」を制御せよ:CommandInProgressを用いた高速・堅牢なバッチ処理の極意
SolidWorks APIを操るエンジニア諸君。君たちの書いたマクロが、大量のパーツを処理している最中に「ユーザーの不用意なクリック」や「バックグラウンドの割り込み」でクラッシュした経験はないだろうか?
特に、数百のファイルをループで回すようなバッチ処理において、描画の再描画(Rebuild)やUIの更新は、パフォーマンスを殺す最大の要因だ。今回は、私が現場で必ず実装する「CommandInProgress」を用いた処理の完全制御と、爆速バッチ処理を実現するためのアーキテクチャを伝授する。
—
なぜ「CommandInProgress」が必要なのか
SolidWorksのAPIは、実行中にユーザーがマウスやキーボードで干渉すると、予期せぬスタックやメモリリークを引き起こす。さらに、GUIが操作可能だと、OS側が「アプリケーションが応答していません」と誤認し、プロセスをフリーズさせることがある。
`SldWorks.CommandInProgress` プロパティを `True` に設定することは、SolidWorksに対して「今から集中作業を行う。すべてのUIインタラクションを拒否し、描画負荷を最小限にせよ」と命令することと同義だ。
この設定によるメリット:
1. 安定性向上: 処理中の割り込みによる例外エラーを物理的に遮断する。
2. 高速化: 画面の更新(再描画)が抑制されるため、処理速度が劇的に向上する。
3. プロフェッショナルな挙動: 処理中はUIがロックされるため、ユーザーに「現在バッチ処理中である」という明確なステータスを伝えられる。
—
現場で即戦力となる「堅牢なバッチ処理テンプレート」
以下は、エラーハンドリングとリソース解放を完璧に網羅した、プロダクション環境でそのまま使えるテンプレートコードだ。
Option Explicit
‘ メイン処理:バッチ処理の呼び出し元
Public Sub RunRobustBatchProcess()
Dim swApp As SldWorks.SldWorks
Set swApp = Application.SldWorks
‘ プロセス開始時の安全策
On Error GoTo Cleanup
‘ 【重要】処理中はUIをロックしてパフォーマンスを最大化
swApp.CommandInProgress = True
‘ モデルの再構築抑制(パフォーマンスの要)
swApp.UserControl = False
‘ ここに処理ロジックを記述
Call ProcessPartFiles(swApp)
Cleanup:
‘ 【重要】何があっても必ずロックを解除する
swApp.CommandInProgress = False
swApp.UserControl = True
If Err.Number <> 0 Then
MsgBox “エラー発生: ” & Err.Description, vbCritical
End If
End Sub
Private Sub ProcessPartFiles(swApp As SldWorks.SldWorks)
‘ データベースやファイルリストのループ処理
‘ 例: OpenDoc6 を使用し、非表示で開くのが基本
Dim swModel As SldWorks.ModelDoc2
Dim swDocSpec As SldWorks.DocumentSpecification
‘ 非表示でファイルを開くことで描画負荷をゼロに
Set swDocSpec = swApp.GetOpenDocSpec(“C:\Path\To\Part.sldprt”)
swDocSpec.Silent = True ‘ 警告ダイアログを無視
Set swModel = swApp.OpenDoc7(swDocSpec)
‘ 処理ロジック…
swApp.CloseDoc swModel.GetTitle
End Sub
—
パフォーマンスを最大化するための3つの鉄則
コードを記述する際、以下の3点を意識するだけで処理効率は2〜3倍変わる。
1. `swApp.UserControl = False` を忘れるな
`CommandInProgress` とセットで使うべきだ。これを `False` にすると、SolidWorksのインスタンスが「ユーザーからの操作を受け付けないモード」に入り、バックグラウンド処理に特化した挙動を取るようになる。
2. `Silent = True` によるダイアログの抑制
バッチ処理中に「参照が見つかりません」や「再構築エラー」のダイアログが出るたびに、マクロは停止する。`DocumentSpecification` を使い、`Silent` プロパティを `True` にすることで、無人環境での完全自動化が可能になる。
3. オブジェクトの明示的解放(破棄)
VBAはメモリ管理が甘い言語だ。ループ内で生成した `swModel` や `swFeature` は、必ず `Set obj = Nothing` で解放せよ。数千ファイル処理する場合、これを怠るとメモリリークで必ずSolidWorksが落ちる。
—
チーフアーキテクトからの助言
「自動化」の本質は、ただコードを書くことではない。「いかに予期せぬ事態を予測し、それをコードで潰しておくか」という予防医学的なアプローチこそが、エンジニアの腕の見せ所だ。
君たちが開発するツールは、単なるスクリプトではなく、企業の生産性を左右する重要なインフラだ。この `CommandInProgress` のテクニックをマスターし、現場から「SolidWorksが落ちる」という嘆きを根絶してほしい。
次回の記事では、`IModelDocExtension::Rebuild` を駆使した、より高度なジオメトリ更新の最適化について深掘りしよう。健闘を祈る。
