【入門編】【パフォーマンス改善】SldWorks.CommandInProgressを用いたマクロ実行中のユーザ介入ブロックと処理高速化 – SolidWorks VBA解析バイブル

スポンサーリンク

SolidWorks VBAを掌握する極限の知見:バッチ処理を「鉄壁」にするための高速化術

こんにちは。SolidWorksの自動化の世界へようこそ。
マクロの記録ボタンを押して、生成されたコードを眺める段階は卒業しましたか?

実務で100個、1000個ものパーツを自動生成する際、多くの人が直面する壁があります。それは「処理中にユーザーが誤ってマウスを触ってしまい、マクロがエラーで止まる」あるいは「画面の更新が重すぎて、処理時間が数倍に膨れ上がる」という問題です。

今日は、プロの現場で必須となる「ユーザー介入のブロック」と「画面更新の完全停止による高速化」という、堅牢な自動化の極意を伝授します。

1. なぜ「止まる」のか? なぜ「遅い」のか?

SolidWorksは、ユーザーが画面を操作することを前提に設計されています。そのため、マクロが動いている最中にマウスがクリックされたり、ウィンドウがフォーカスされたりすると、APIは「ユーザーによる介入」と判断し、処理を中断させようとします。

また、フィーチャを1つ作るたびに画面を再描画(レンダリング)していたら、PCは「描画処理」という重いタスクに忙殺されます。これでは、本来の「形状生成」にリソースを割けません。

これを解決するのが、`swApp.CommandInProgress``swApp.Visible` (または `swModel.GraphicsRedraw2`) の制御です。

2. 鉄壁のバッチ処理を実現するテンプレートコード

以下のコードは、大量のパーツをループ処理する際の「守りの要」です。これらを処理の前後に配置するだけで、あなたのマクロは別次元の安定性と速度を手に入れます。

Option Explicit

Sub BatchProcess_With_Performance_Tune()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2

Set swApp = Application.SldWorks

‘ — 【重要】パフォーマンス・堅牢化設定 —
‘ 1. ユーザー介入をブロック(マクロ実行中はマウス操作を受け付けない)
swApp.CommandInProgress = True

‘ 2. 画面更新を停止(これが劇的な高速化を生む)
swApp.Frame.KeepAlive = True
‘ 3. モデルの再描画を抑止
‘ ※処理の最後に戻すのを忘れないように!
‘ —————————————

‘ — ここにメインの処理(パーツ生成など)を書く —
‘ 例:大量のフィーチャ生成ループなど
‘ ———————————————

‘ — 【重要】終了後のクリーンアップ —
‘ 必ず最後に設定を戻すこと!戻さないとSolidWorksが操作不能になります
swApp.CommandInProgress = False

‘ 画面更新を再開し、最後に一度だけ再描画する
swApp.Frame.KeepAlive = False
‘ 最後に画面を強制リフレッシュ
‘ swModel.GraphicsRedraw2

MsgBox “バッチ処理が完了しました。”
End Sub

3. コードのポイントを紐解く

① `swApp.CommandInProgress = True`

これは「SolidWorks君、今は僕の指示以外は聞かなくていいよ」と宣言する魔法のスイッチです。これをオンにすると、マクロ実行中のマウス入力による割り込みや、意図しないモーダルダイアログの発生を抑制できます。

② `swApp.Frame.KeepAlive`

これを知っているかどうかが、アマチュアとプロの分かれ道です。マクロ処理中、SolidWorksは「画面を書き直すべきか?」と常に悩んでいます。`KeepAlive = True` にすることで、その判断を停止させ、CPUの全リソースを計算処理に集中させます。

4. 陥りやすい「罠」:エラーハンドリングの重要性

初心者が最もやってしまいがちな失敗。それは、「エラーが発生してマクロが途中で止まった際に、設定を戻し忘れること」です。

もし `CommandInProgress = True` のままマクロが止まると、SolidWorksは操作を受け付けない「フリーズ状態」に陥ります。これを防ぐために、必ず `On Error GoTo` を活用してください。

Sub RobustProcess()
On Error GoTo ErrorHandler

‘ 設定オン
Application.SldWorks.CommandInProgress = True

‘ … ここに重い処理 …

Cleanup:
‘ 正常終了時も異常終了時も、必ずここを通る
Application.SldWorks.CommandInProgress = False
Exit Sub

ErrorHandler:
MsgBox “エラーが発生しました: ” & Err.Description
Resume Cleanup
End Sub

最後に:先輩エンジニアからのアドバイス

マクロを単なる「時短ツール」から「信頼できる職人」に昇格させるのは、こうした細かい設定の積み重ねです。

最初は難しく感じるかもしれませんが、「処理の前でスイッチを入れ、処理の後で必ず切る」。このライフサイクルを意識するだけで、あなたの書くコードは驚くほどプロフェッショナルなものになります。

さあ、次はどんなパーツを自動生成しましょうか? あなたの素晴らしい挑戦を応援しています。

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