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
—
最後に:先輩エンジニアからのアドバイス
マクロを単なる「時短ツール」から「信頼できる職人」に昇格させるのは、こうした細かい設定の積み重ねです。
最初は難しく感じるかもしれませんが、「処理の前でスイッチを入れ、処理の後で必ず切る」。このライフサイクルを意識するだけで、あなたの書くコードは驚くほどプロフェッショナルなものになります。
さあ、次はどんなパーツを自動生成しましょうか? あなたの素晴らしい挑戦を応援しています。
