【入門編】【画面再描画の完全制御】SwApp.EnableUserInterfaceとVisibleStateChangeによる圧倒的なマクロ高速化手法 – SolidWorks VBA解析バイブル

スポンサーリンク

こんにちは!SolidWorks自動化の現場で奮闘する皆さん、先輩エンジニアの私です。

マクロの記録機能を使って「よし、自動化できたぞ!」と実行ボタンを押したものの……。画面が猛烈な勢いでパチパチと点滅し、モデルがあっちを向きこっちを向き、完了するまでにやたらと時間がかかった経験はありませんか?

「自分のPC、スペック低いのかしら……」と悩む必要はありません。それはPCの性能不足ではなく、SolidWorksのGUI(画面描画エンジン)が、裏で一生懸命“無駄な絵の描き直し”をさせられているからです。

今回は、マクロ実行中の画面を完全に凍結(シャットダウン)し、処理速度を限界まで引き上げるプロの極意【画面再描画の完全制御】を伝授します。ここをクリアすれば、あなたのマクロは見違えるほど軽快になり、ワンランク上のエンジニアへとステップアップできますよ!

1. なぜSolidWorksマクロは画面がチラつくと遅いのか?

SolidWorksは、世界最高峰の3D CADエンジンです。VBAから「このフィーチャーを追加して」「この寸法を変えて」と命令するたびに、親切なSolidWorksは「はい!ユーザー様にお見せするために、すぐに画面を再描画しますね!」と、グラフィックを必死に更新します。

これが「画面のチラツキ(フリッカー)」の正体です。

人間にとっては一瞬のチラツキでも、PCのCPUやGPUにとっては「3Dモデルの再計算 + 画面のピクセル再描画」という重たい処理の連続です。これが100回、1000回と繰り返されたら……そりゃあマクロも遅くなりますよね。

プロの世界では常識ですが、「機械(VBA)が作業している間は、人間に画面を見せる必要はない」のです。作業が終わった一瞬だけ画面を更新させれば、パフォーマンスは劇的に向上します。

2. 画面制御の二大巨頭:`EnableUserInterface` と `VisibleStateChange`

SolidWorks VBAでこの画面描画を完全にコントロールするために使うのが、主に以下の2つのアプローチです。

1. `SwApp.EnableUserInterface` (ユーザーインターフェースの有効/無効化)

  • マクロ実行中のUI操作や画面更新を丸ごとロックします。

2. `ModelDoc2.Savesetting` やビューの自動更新停止系メソッド

  • モデル個別の再描画を抑制します。

今回は特に、アプリケーション全体で画面の描画とユーザー入力を完全にシャットダウンする、最も強力な `EnableUserInterface` の使い方を見ていきましょう。

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

それでは、実際に現場で使える「画面再描画を完全制御した安全なマクロ構造」のテンプレートをお見せします。

ここで非常に重要なポイントがあります。「画面をロックしたら、エラーが起きようが絶対に解除(Unlock)する」ということです。これを怠ると、マクロが途中でエラー落ちした際にSolidWorksの画面がフリーズしたまま二度と操作できなくなる(通称:デス状態)という悲劇が起きます。

必ず `On Error GoTo` などのエラーハンドリングとセットで実装しましょう。

‘ ==============================================================================
‘ 処理速度を限界突破させる!画面再描画完全制御のテンプレート
‘ ==============================================================================
Sub FastMacroTemplate()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2

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

‘ もしドキュメントが開いていなかったら終了
If swModel Is Nothing Then
MsgBox “アクティブなドキュメントがありません。”, vbExclamation
Exit Sub
End If

‘ 【超重要】エラーが発生しても確実に画面ロックを解除するための構文
On Error GoTo ErrorHandler

‘ 1. 処理開始:画面描画とユーザー入力を完全にシャットダウン!
‘ —————————————————————–
swApp.EnableUserInterface = False ‘ UI全体の操作・描画をロック
swModel.EnableRebuildSelect = False ‘ 再構築時の選択・描画を抑制

‘ (ここに重たい処理を記述する例:例としてメッセージを挟むが実際はループ処理など)
Dim i As Long
For i = 1 to 100
‘ 例:何か裏で行う処理(画面は一切更新されません)
‘ swModel.Parameter(“D1@Sketch1”).SystemValue = i 0.001
Next i

‘ 2. 処理終了:画面ロックを解除し、最後に一度だけ画面を更新!
‘ —————————————————————–
swModel.EnableRebuildSelect = True
swApp.EnableUserInterface = True

‘ 最後に強制的に一度だけ再描画(Graphics Refresh)を行う
swModel.GraphicsRedraw2

MsgBox “処理が爆速で完了しました!”, vbInformation
Exit Sub

ErrorHandler:
‘ 【安全装置】万が一エラーでマクロが止まっても、ここで必ず画面を復旧させる
swModel.EnableRebuildSelect = True
swApp.EnableUserInterface = True
swModel.GraphicsRedraw2

MsgBox “エラーが発生しましたが、画面ロックは正常に解除されました。” & vbCrLf & _
“エラー内容: ” & Err.Description, vbCritical
End Sub

4. コードの解説とプロの知見

ここまでのコードで、特に意識してほしいポイントを噛み砕いて解説しますね。

① `swApp.EnableUserInterface = False` の威力

これを実行した瞬間、SolidWorksの画面は「描画の更新」をピタリと止めます。裏側ではもの凄いスピードでVBAからの命令が処理されていきますが、モニター画面はフリーズしたかのように動きません。
初心者の方は「固まった!?」と焦るかもしれませんが、正常に裏で仕事をしている証拠ですので安心してください。

② 終わりの作法:`GraphicsRedraw2`

画面ロックを `True` に戻しただけでは、最後に変更されたグラフィックが正しく画面に反映されないことがあります。
そのため、ロックを解除した直後に `swModel.GraphicsRedraw2` を1回だけ呼ぶのが、プロの美しい作法です。これにより、一瞬で最新の綺麗なモデル画面がユーザーに提示されます。

③ エラーハンドリング(安全装置)の絶対性

先ほども触れましたが、`EnableUserInterface = False` にした状態でVBAがエラー落ちすると、SolidWorksのUIが無効化されたままになり、マウスをクリックしても何も反応しなくなります。
強制終了するハメになり、保存していないデータが吹き飛ぶ地獄を味わうことになります。「画面を消したら、必ず戻す(Error Handler)」。これはVBAエンジニアの絶対の戒めとして覚えておいてください。

まとめ

いかがでしたか?今回はSolidWorks VBAにおけるパフォーマンスチューニングの極意、画面再描画の完全制御について解説しました。

  • マクロの遅さの元凶は「無駄な画面の再描画」にある。
  • `swApp.EnableUserInterface = False` で画面とUIを完全にシャットダウンする。
  • エラーが起きても確実に復旧できるよう、必ずエラーハンドリングとセットで書く。

このテクニックを取り入れるだけで、今までイライラしながら待っていた巨大アセンブリの自動処理や、大量の図面一括処理が、嘘のように一瞬で終わるようになります。

ここをクリアすれば、あなたのSolidWorks VBAのスキルは「動くコードが書ける初心者」から「実務で使えるプロの自動化エンジニア」へと確実にステップアップしていますよ。ぜひ、明日からの開発現場で試してみてくださいね!

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