【入門編】【パフォーマンス改善】SwApp.SetUserPreferenceToggleによるマクロ実行中の画面描画停止と高速化 – SolidWorks VBA解析バイブル

スポンサーリンク

こんにちは!SolidWorksの自動化の世界へようこそ。
マクロの記録機能を使って「よし、これで大量のパーツを自動生成できるぞ!」と実行ボタンを押したものの、画面がバキバキとちらつき、1つの穴を開けるのに数秒もかかってしまい、イライラした経験はありませんか?

「自分のコードの書き方が悪いのかな……」と落ち込む必要はありません。原因はコードの良し悪しではなく、SolidWorksの『画面描画と再計算(リビルド)』の重さにあります。

今回は、数あるAPIテクニックの中でも「これを知っているかどうかでエンジニアとしての格が分かれる」と言っても過言ではない、超重要かつ即効性のあるパフォーマンス改善術――`SwApp.SetUserPreferenceToggle` を使った画面描画の完全抑止について、魂を込めて解説します。

ここをクリアすれば、あなたのマクロは見違えるほど高速になり、SolidWorks VBAの裏側の挙動を完全に掌握できるようになりますよ!

1. なぜマクロの実行中は画面が重くなるのか?

まず、SolidWorksの「おせっかいな親切心」について知る必要があります。

私たちがVBAで「フィーチャを追加せよ」「穴を開けろ」と命令すると、SolidWorksは忠実にその命令を実行します。そして、命令が1つ実行されるたびに、ご丁寧に画面を再描画(グラフィックスの更新)し、モデル全体のジオメトリを再計算(リビルド)しているのです。

  • 人間の目には一瞬で見えないような微細な線の描画更新
  • 「今の変更で他の寸法に影響が出ていないか?」という全体再計算

これらが、数十・数百回と繰り返されるループの中で発生するとどうなるでしょうか?
処理時間の9割以上が「画面の描き直し」と「無駄な再計算」に奪われ、マクロがカメのように遅くなってしまいます。

これを防ぐための特効薬が、「マクロ実行中は画面を描画するな!再計算も最小限にしろ!」とSolidWorksに命令することです。

2. 魔法のAPI:`SetUserPreferenceToggle` とは

ここで登場するのが、SolidWorksアプリケーション全体の設定を操作する `SetUserPreferenceToggle` メソッドです。

このメソッドを使うと、普段私たちが「ツール > オプション」から手動で変更しているシステムオプションを、VBAのコードから一瞬で切り替えることができます。

今回狙うのは、以下の2つの設定です。
1. 画面の自動再描画(Auto-redraw)を止める
2. フィーチャ作成時の自動プレビューや更新を止める

⚠️ 【超重要】「画面を止める」ときの鉄の掟

画面の描画を止めるコードを書くときは、必ず「エラーが起きても確実に画面描画を復旧させる仕組み(例外処理・終了処理)」とセットで作るのがプロの鉄則です。

もし、描画を止めたままマクロがエラーで途中で止まってしまったらどうなるでしょう? SolidWorksの画面がフリーズしたような状態になり、最悪の場合、アプリケーションをタスクマネージャーから強制終了する羽目になります。

3. 【実践】爆速化テンプレートコード

それでは、実際に画面描画を停止し、劇的なスピードでパーツを生成・編集する実用的なVBAコードを見てみましょう。
そのままコピー&ペーストして、VBE(Visual Basic Editor)の標準モジュールに貼り付けて試してみてください。

Option Explicit

‘ ユーザー設定の定数定義(SW2021以降標準)
‘ swUserPreferenceToggle_e や swUserPreferenceIntegerValue_e に該当する値
Const swViewDisplayModeFast = 0
Const swUpdateWhileDragging = 12 ‘ ドラッグ中の更新など

Sub Main()
Dim swApp As SldWorks.SldWorks
Dim swPart As SldWorks.PartDoc
Dim longstatus As Long

‘ アプリケーションの取得
Set swApp = Application.SldWorks

‘—————————————————-
Dim originalScreenUpdate As Boolean
Dim originalRebuildOnLoad As Boolean

On Error GoTo ErrorHandler ‘ エラー時の画面凍結防止トラップ

‘ 1. 現在の設定(画面描画の有無)を退避しておく
originalScreenUpdate = swApp.GetUserPreferenceToggle(swUserPreferenceToggle_e.swViewUpdateAfterSave) ‘※環境によりトグル番号は調整

‘ 2. ★【最重要】画面描画と自動再計算を完全に停止する★
‘ 画面のちらつきを抑止 (Falseを指定)
swApp.Visible = True ‘ アプリ自体は見えたままにする
swApp.SetUserPreferenceToggle swUserPreferenceToggle_e.swInteractiveRedraw, False

‘ 自動リビルドを抑制(※APIのバージョンによりswRebuildOnActivation等の組み合わせを活用)
swApp.SetUserPreferenceToggle swUserPreferenceToggle_e.swDocumentPropertiesAutoRebuild, False

‘ 処理のパフォーマンスを最大化するため、バックグラウンド処理へ切り替え
swApp.CommandInProgress = True

‘—————————————————-
‘ 【ここから重い処理(パーツ生成・フィーチャ追加など)】
‘—————————————————-
Debug.Print “重い処理を開始します…”

‘ 新規パーツ作成
Set swPart = swApp.NewDocument(“C:\ProgramData\SolidWorks\SolidWorks 2023\templates\part.prtdot”, 0, 0, 0)

Dim i As Long
For i = 1 to 50
‘ 実際にはここでスケッチ作成やボス押し出しなどの重い処理が連続すると仮定
‘ 例: 処理をシミュレートするダミーウェイト
DoEvents
Next i

Debug.Print “処理が完了しました。”
‘—————————————————-

ErrorHandler:
‘—————————————————-
‘ 3. ★【絶対に忘れてはいけない】設定の復元と画面の再描画★
‘—————————————————-
‘ エラーの有無に関わらず、必ず描画フラグを元に戻す
swApp.SetUserPreferenceToggle swUserPreferenceToggle_e.swInteractiveRedraw, True
swApp.CommandInProgress = False

‘ 最後にモデル全体を1回だけ強制リビルドして画面を綺麗に更新する
If Not swPart Is Nothing Then
Dim swModel As SldWorks.ModelDoc2
Set swModel = swPart
swModel.ForceRebuild3 True
End If

‘ エラー処理の終了
If Err.Number <> 0 Then
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical
End If
End Sub

4. コードの解説とエンジニアの知見

このコードのポイントは、単に「画面を止める」だけでなく、「最後に1回だけリビルド(強制再計算)して画面を整える」という点にあります。

マクロ実行中は画面が真っ白(あるいは直前の古い画面のまま)で更新されませんが、内部では確実にパーツが組み上がっていきます。そして、マクロの最後の最後で `ForceRebuild3 True` を呼び出すことで、「散々っぱら計算を後回しにして一気に組み上げたパーツ」の最終形態が、1フレームでスッと画面に現れるという仕組みです。

このアプローチを取るだけで、処理時間が従来の1/5〜1/10以下(体感では瞬間的)に短縮されるケースが多々あります。

よくあるつまずきポイント

  • 「コードを途中で止めたらSolidWorksが固まった!」

→ 開発中にVBAの「[■](リセット)」ボタンを押して強制終了させると、`swInteractiveRedraw` が `False` のままになり、画面が更新されなくなることがあります。その場合は、一度SolidWorksを再起動するか、イミディエイトウィンドウで `Application.SldWorks.SetUserPreferenceToggle 38, True` (※トグル番号による)を実行して復旧させてください。

まとめ

今回は、SolidWorks VBAのパフォーマンスを極限まで引き上げる『画面描画停止と高速化』について解説しました。

  • マクロの遅さの元凶は「毎回の画面描画」と「無駄な再計算」
  • `SetUserPreferenceToggle` で一時的に描画と自動リビルドをオフにする
  • 必ず `On Error` を使って、処理の最後には描画をONに戻して強制リビルドする

このテクニックをあなたのマクロに組み込むだけで、業務効率は劇的に跳ね上がります。「動くだけの遅いマクロ」から、「プロフェッショナルな爆速自動化ツール」へステップアップできたはずです。

ここをクリアしたあなたなら、もうSolidWorks VBAの基礎でつまずくことはありません。自信を持って、次の自動化チャレンジへ進んでくださいね!

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