【入門編】【実務中級】大規模アセンブリのパフォーマンス劇的改善:VBA実行中の画面描画停止とイベント抑制 – SolidWorks VBA解析バイブル

スポンサーリンク

こんにちは!SolidWorksの自動化の世界へようこそ。
日々、何百もの部品が入り組んだ巨大なアセンブリを相手に、カクカクと動く画面を眺めながら「あぁ、早く終わってくれ…」とコーヒーをすする時間は、もう終わりにしましょう。

マクロの記録ボタンを押して生成されたコードをそのまま動かしていませんか?
「なんだかVBAの実行がやたらと遅い」「部品を一つ追加するたびに画面がチラついてイライラする」――もしあなたがそう感じているなら、ここがエンジニアとしての大きな分水嶺です。

今回は、数万点規模の大規模アセンブリであっても、VBAの処理速度を文字通り「爆速」へと引き上げるための極意【画面描画停止とイベント抑制】を授けましょう。ここをクリアすれば、あなたのマクロは見違えるほどスマートでプロフェッショナルな動きに生まれ変わります。さあ、一緒に扉を開けましょう!

—

1. なぜ、標準のマクロは「遅い」のか?

SolidWorksのAPIは非常に強力ですが、デフォルトでは「親切すぎる」という弱点があります。

マクロが1つの部品を配置し、合致(Mate)を組むたびに、SolidWorksは律儀に以下の処理を行っています。
1. 画面の再描画(グラフィックスの更新)
2. アセンブリ全体の自動再構築(Rebuild)
3. バックグラウンドでのイベント監視

人間が画面を見ながら操作している分にはありがたい機能ですが、コンピュータが高速に自動処理を行っている最中には、これらはすべて「重荷(ボトルネック)」でしかありません。 画面を書き換えているその数ミリ秒の積み重ねが、トータルで何分ものロスを生み出しているのです。

「見えないところで、ただ黙々と働かせる」。これが大規模アセンブリを制する鉄則です。

—

2. 爆速化の三種の神器(APIメソッド)

SolidWorks VBAで実行速度を劇的に改善するために使用する主要なAPIメソッドは以下の3つです。これらをマクロの「開始時」にOFFにし、「終了時」に必ずONに戻します。

| 制御対象 | APIメソッド / プロパティ | 役割 |
| :— | :— | :— |
| 画面描画 | `SldWorks.Visible` または `ModelDoc2.GraphicsRedraw` | 画面の更新を止め、グラフィック処理の負荷を消し去る |
| 自動再構築 | `SldWorks.SetUserPreferenceToggle(swUserPreferenceToggle_e.swAutoRebuild, False)` | 部品追加ごとの無駄な再計算をストップする |
| イベント抑制 | `ModelDocExtension.HideTreeItem` や 各種イベントハンドラの制御 | 余計な裏側処理をカットする |

※特に強力なのが 「自動再構築の無効化」 と 「画面描画の停止」 です。これらを組み合わせるだけで、体感速度が3倍〜10倍以上に跳ね上がります。

—

3. 【実務で即コピペ可能】爆速アセンブリ操作テンプレート

それでは、実際のVBAコードを見てみましょう。
ここでは、「画面描画の停止」「自動再構築の停止」「エラーハンドリング(万が一途中で止まっても設定を戻す安全装置)」を組み込んだ、実務レベルの模範的なコードを提示します。

Option Explicit

‘ ——————————————————————————–
‘ 大規模アセンブリの高速処理テンプレート
‘ ——————————————————————————–
Sub FastAssemblyAutomation()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swAssembly As SldWorks.AssemblyDoc

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

‘ アクティブドキュメントがアセンブリかチェック
If swModel Is Nothing Then
MsgBox “ドキュメントが開かれていません。”, vbCritical
Exit Sub
End If
If swModel.GetType <> swDocumentTypes_e.swDocASSEMBLY Then
MsgBox “アクティブなドキュメントがアセンブリではありません。”, vbCritical
Exit Sub
End If

Set swAssembly = swModel

‘ ==========================================
‘ 【重要】処理開始前の環境設定(爆速化スイッチON)
‘ ==========================================
On Error GoTo ErrorHandler ‘ 途中でエラーが起きても設定を戻せるようにする

‘ 1. 画面の自動再描画を停止
swApp.Visible = False ‘ ※画面自体を非表示にするアプローチ(またはGraphicsRedraw系の制御)
‘ ※SolidWorksの仕様上、swApp.Visible = Falseはウィンドウを消してしまうため、
‘ 実務では以下の「画面更新停止」フラグを使用するのが一般的です。
swModel.LockRefresh

‘ 2. 自動再構築(Auto-Rebuild)を一時無効化
Dim originalAutoRebuild As Boolean
originalAutoRebuild = swApp.GetUserPreferenceToggle(swUserPreferenceToggle_e.swAutoRebuild)
swApp.SetUserPreferenceToggle swUserPreferenceToggle_e.swAutoRebuild, False

‘ ——————————————————————————–
‘ 【ここからメインの重い処理】
‘ 例:大量の部品配置や合致追加のコードがここに入ると想定してください。
Dim i As Long
For i = 1 to 100
‘ ─── 重たいAPI処理(部品の挿入・Mate定義など) ───
‘ 例: swAssembly.AddMate5(…) など
Next i
‘ ——————————————————————————–

ErrorHandler:
‘ ==========================================
‘ 【重要】処理終了後の環境復旧(絶対に通すこと!)
‘ ==========================================

‘ 1. 自動再構築の設定を元に戻す
swApp.SetUserPreferenceToggle swUserPreferenceToggle_e.swAutoRebuild, originalAutoRebuild

‘ 2. 画面描画のロックを解除し、最後に一度だけ再構築&描画を行う
swModel.UnlockRefresh
swModel.ForceRebuild3 False ‘ 溜まっていた変更をまとめて一気に計算!

If Err.Number <> 0 Then
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical
Else
MsgBox “すべての処理が爆速で完了しました!”, vbInformation
End If

End Sub

—

4. チーフアーキテクトからの重大な警告(陥りやすい罠)

このテクニックを使う上で、全エンジニアが絶対に知っておかなければならない「致命的な罠」が1つだけあります。

それは、「エラーハンドリング(On Error GoTo)をサボると、SolidWorksが二度と再描画しなくなるバグ状態に陥る」ということです。

もし、コードの途中でインデックスエラーや予期せぬVBAの停止(クラッシュ等)が起きたとき、`LockRefresh` や `UserPreferenceToggle` が元の状態に戻る前にマクロが終了してしまうとどうなるか?
――そう、SolidWorksの画面がフリーズしたまま(あるいは二度と再描画されない状態)で固まってしまいます。

だからこそ、上記のサンプルコードのように、必ず `On Error GoTo ErrorHandler` を仕込み、どんな例外が起きたとしても、最後には必ず `UnlockRefresh` と設定の復元が実行される構造を徹底してください。これがプロとアマを分ける決定的な境界線です。

—

まとめ:ここをクリアすれば、もう怖くない

いかがでしょうか?
画面描画の停止とイベント抑制というアプローチは、大規模アセンブリを扱う現場において「知っているか、いないか」だけで生産性が10倍変わる極上の知見です。

  • 処理の直前で画面更新をロックし、自動再構築を切る。
  • 内部でどれだけ重い処理を行っても、画面には一切触れさせない。
  • 処理の最後で一気に再構築をかけ、ロックを解除する。
  • エラー時でも確実に設定を復旧する防壁を張る。

この型をあなたのVBAツールボックスに組み込めば、どんなに巨大なアセンブリが来ようとも、もう恐れるものは何もありません。
明日からのSolidWorksライフが、驚くほど快適になることを約束します。それでは、また次の現場でお会いしましょう!

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