【実務・中級編】【パフォーマンス改善】SwApp.SetUserPreferenceToggleで画面描画を停止してマクロを爆速化 – SolidWorks VBA解析バイブル

スポンサーリンク

SolidWorks VBAを掌握せよ:画面更新を制する者が「爆速マクロ」を制する

SolidWorks APIを使いこなしているつもりでも、数百個の部品をアセンブリから叩き出したり、全コンフィギュレーションをループ処理したりした際に「終わらないプログレスバー」を眺めて溜息をついたことはないだろうか。

「マクロが遅い」のではない。君の書き方が、SolidWorksの貴重なリソースを無駄に浪費しているだけだ。

今回は、業務自動化の現場で「プロ」と「アマ」を分かつ決定的な境界線、『画面再描画と再計算の最適化』について、深淵まで解説する。

なぜ、画面描画を停止させなければならないのか

SolidWorksは、API経由でコマンドを投げるたびに、律儀にグラフィックス領域を更新しようとする。これがパフォーマンスを殺す最大の要因だ。

1. GDIのリソース消費: マウスの動きやボタン操作と同様に、APIの操作ごとに画面を再描画するのは、重い処理であればあるほどCPUとGPUの無駄遣いである。
2. フィーチャーの再計算: `SetUserPreferenceToggle` を適切に使わないと、変更のたびにフィーチャーツリー全体が「再計算すべきか?」と自問自答を始める。

これを止める。コードが実行されている間、SolidWorksには「余計なことをせず、計算だけに集中しろ」と命じるのだ。

実践:爆速化を実現するプロダクションコード

単に停止させるだけでは、エラー発生時に「描画が止まったまま」という最悪のUXを生む。必ず例外処理(On Error GoTo)とセットで設計するのがプロの流儀だ。

‘ —————————————————————————
‘ 高速化を担保するメインプロシージャのテンプレート
‘ —————————————————————————
Public Sub OptimizeMacroExecution()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2

‘ 初期設定
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc

‘ エラーハンドリングの要:途中で落ちても画面を復帰させる
On Error GoTo ErrorHandler

‘ 【核心】システム設定の変更
‘ swViewRefresh: 画面再描画を停止
‘ swRebuildOnSave: 保存時の不要な再計算を抑制
swApp.SetUserPreferenceToggle swViewRefresh, False

‘ — ここに重い処理を記述 —
‘ 例: 大量部品の属性変更ループなど
‘ DoWork swModel
‘ ————————–

‘ 終了処理へ
GoTo CleanUp

ErrorHandler:
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical

CleanUp:
‘ 【重要】設定を必ず元に戻す
swApp.SetUserPreferenceToggle swViewRefresh, True

‘ 画面を強制的にリフレッシュ
If Not swModel Is Nothing Then swModel.GraphicsRedraw2

Debug.Print “処理完了”
End Sub

守るべき「鉄の掟」:設計上の注意点

この手法を導入する際、以下の3点を徹底してほしい。

1. エラーハンドリングは「逃げ場」ではなく「復帰装置」

`On Error GoTo` を使わずに画面描画停止を実装するのは、ブレーキのないスポーツカーで時速300kmを出すようなものだ。マクロがエラーで止まった瞬間、SolidWorksが「画面更新なし」のままフリーズして見える。ユーザーは「PCが壊れた」と勘違いするだろう。必ず `CleanUp` ラベルを用意し、いかなる出口でも必ず `True`(再描画許可)に戻すこと。

2. `GraphicsRedraw2` の正しい使い所

処理が終わった直後に `GraphicsRedraw2` を明示的に呼ぶことで、ユーザーに「処理が完了した」という視覚的なフィードバックを即座に与えることができる。これを怠ると、画面が更新されるまでユーザーは不安になる。

3. データベース連携時は「モデルのクローズ」を慎重に

大量のファイルを順次開いて処理する場合、`swApp.CloseDoc` を多用することになる。この時、`SetUserPreferenceToggle` が効いていると、バックグラウンドでのメモリ解放が非常にスムーズになる。ただし、ファイルの保存確認ダイアログ(`swApp.SetUserPreferenceToggle swSaveDontPrompt, True`)も併用しないと、ループ処理がダイアログ待ちで止まるので注意が必要だ。

最後に:エンジニアとしての矜持

「とりあえず動く」マクロは、スクリプトキディでも書ける。
しかし、「計算リソースの制約を理解し、計算機にストレスを与えず、かつエラー時にも安全に復帰する」コードは、アーキテクトにしか書けない。

君が書く自動化ツールは、明日から現場の設計者が毎日使う「生産性の源泉」になるはずだ。そのコードが、無駄な再描画でCPUを空回りさせていないか、一度立ち止まって見直してほしい。

君のコードが、SolidWorksを極限まで速く走らせることを期待している。

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