SolidWorks VBAの「画面のちらつき」を封印し、マクロを秒速化する極意
こんにちは。SolidWorksの自動化の世界へようこそ。
マクロを動かしたとき、画面がバチバチと点滅し、一つひとつのフィーチャが生成される様子を眺めて「うわ、遅いな…」と感じたことはありませんか?
実は、その「画面の動き」こそが、あなたのマクロを遅くしている最大の犯人です。SolidWorksは本来、GUI(画面)を描画するために膨大な計算リソースを消費します。バックグラウンドで処理を行う際、この描画を止めるだけで、マクロの実行速度は劇的に向上します。
今日は、「マクロの速度を物理的限界まで引き上げるための禁断のテクニック」を伝授します。
—
なぜ「画面の再描画」が速度を殺すのか?
SolidWorksのAPIは、実行されるたびに「今の状態をユーザーに見せるべきか?」を判断し、画面を更新しようとします。1つや2つのフィーチャなら問題ありませんが、100個、1000個と操作を積み重ねる場合、その「更新処理」だけで実行時間の8割以上が浪費されます。
プロのエンジニアは、マクロの実行中に「一度画面を冷凍し、処理が終わった瞬間に解凍する」という手法をとります。
—
パフォーマンスを最大化する「鉄板」コード
以下の定型句をマクロの「開始」と「終了」に挟み込むだけで、あなたのマクロは別次元の速さになります。
Sub OptimizeMacro()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
‘ — 処理開始:描画を完全に封印 —
‘ 画面更新を停止する(これだけで速度が激変する)
swApp.Visible = True ‘ アプリ自体は表示したまま
swModel.EnableGraphicsUpdate = False
‘ フィーチャ生成中の自動ズームなどを抑止
‘ ※ViewZoomtofitなどは処理の最後に一度だけ呼ぶのが鉄則
‘ — ここに重い処理を書く —
‘ 例:大量の穴を作成、パターン生成など
‘ — 処理終了:封印を解く —
swModel.EnableGraphicsUpdate = True
‘ 最後に一度だけ全体を表示して、ユーザーに結果を見せる
swModel.ViewZoomtofit2
MsgBox “処理が完了しました。”
End Sub
コードの重要ポイント解説
1. `EnableGraphicsUpdate = False`
これが今回の主役です。これをFalseにすると、SolidWorksは「画面を書き換える」という重い作業をサボるようになります。その分、メモリとCPUを純粋な「ジオメトリ計算」に全振りできるため、体感速度が数倍から数十倍に跳ね上がります。
2. `ViewZoomtofit2` は「最後に1回」だけ
処理の途中で `ViewZoomtofit2` を何度も呼んでいませんか? それは「走っている最中に何度も立ち止まって景色を確認している」のと同じです。全てが終わった後に一度だけ呼べば、結果は正しく表示されます。
—
初学者が陥りやすい罠:エラーハンドリング
画面更新を止めている最中にエラーが発生すると、「SolidWorksが固まったまま(描画が止まったまま)動かなくなる」という悲劇が起こります。
これを防ぐには、必ず `On Error GoTo` を使いましょう。
Sub SafeExecution()
‘ …(初期化処理)…
On Error GoTo ErrorHandler
swModel.EnableGraphicsUpdate = False
‘ 重い処理を書く
‘ 正常終了時の処理
swModel.EnableGraphicsUpdate = True
Exit Sub
ErrorHandler:
‘ エラーが起きたら必ず描画を復旧させる
swModel.EnableGraphicsUpdate = True
MsgBox “エラーが発生しました:” & Err.Description
End Sub
—
まとめ:今日からできるステップアップ
- 「マクロの記録」から卒業する第一歩は、描画制御です。
- `EnableGraphicsUpdate = False` で物理的な負荷を減らす。
- エラー発生時に描画が止まったままにならないよう、必ず復帰処理を記述する。
ここをクリアすれば、あなたはもう「記録されたマクロを叩く人」ではなく、「SolidWorksの挙動を支配するエンジニア」の入り口に立っています。
もし、さらに複雑なアセンブリ操作や、メモリリークを避けるためのオブジェクト解放(`Set swObj = Nothing`)について知りたいことがあれば、いつでも聞いてくださいね。応援しています!
