【SolidWorks VBA高速化の極意】そのマクロ、描画を止めるだけで「数分」が「数秒」に変わる
こんにちは。SolidWorks APIの深淵へようこそ。
「マクロを実行すると、画面がチカチカして、終わるまでコーヒーを飲みに行く羽目になる…」
もしあなたがそんな経験をしているなら、それは「SolidWorksの呼吸」を止めていないからかもしれません。
多くの初学者が陥る罠、それは「人間が操作するようにコードを書くこと」です。しかし、APIの世界では、画面の更新やフィーチャの再構築は、プログラムにとって最大のボトルネックです。今回は、マクロの実行時間を劇的に短縮する「描画抑制(Freeze)」の神髄を伝授します。
—
1. なぜマクロは遅いのか?「画面の再描画」という重荷
SolidWorksでフィーチャを追加するたび、背後では以下のことが行われています。
1. ジオメトリ計算(数学的処理)
2. FeatureManagerツリーの更新(GUI表示)
3. グラフィックの再描画(GPUへの命令)
特に3番目の「グラフィックの再描画」は非常に重い処理です。100個の穴を開けるマクロで、毎回画面を更新していたら、GPUは悲鳴を上げます。私たちは、この「描画」をプログラムが終了するまで一時停止させる必要があります。
—
2. 劇的改善!高速化の黄金パターン
これさえ知っておけば、あなたのマクロは別次元の速度を手に入れます。ポイントは `ModelDoc2` オブジェクトの `EnableGraphicsUpdate` メソッドです。
実装コードのテンプレート
Sub SpeedUpMacro()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
‘ — 高速化の魔術:開始 —
‘ 画面更新を一時停止して、再構築を最小限にする
swApp.SetUserPreferenceToggle swUserPreferenceToggle_e.swViewDisplayRealView, False ‘ 必要に応じてRealViewも切る
swModel.EnableGraphicsUpdate = False ‘ 描画を強制停止
swModel.FeatureManager.EnableFeatureTree = False ‘ ツリー更新を停止
‘ —————————————————-
‘ ここに重いフィーチャ作成処理を記述
‘ 例: 100個の押し出しなど
‘ —————————————————-
‘ — 高速化の魔術:終了 —
‘ 処理が終わったら必ず元に戻す(これ重要!)
swModel.EnableGraphicsUpdate = True
swModel.FeatureManager.EnableFeatureTree = True
‘ 最後に一度だけ再構築して画面を更新
swModel.EditRebuild3
MsgBox “処理が完了しました!”, vbInformation
End Sub
—
3. なぜこれで速くなるのか?(プロの視点)
このコードの鍵は、「SolidWorksをバックグラウンドモードに追い込む」という点にあります。
- `EnableGraphicsUpdate = False`: GPUに送る描画命令を遮断します。これにより、マクロ実行中の画面のチラつきが消え、計算だけにリソースを集中させることができます。
- `EnableFeatureTree = False`: フィーチャツリーのスクロールや更新処理を停止します。数千個のフィーチャがあるアセンブリでは、この一行だけで数分単位の短縮が可能です。
- `EditRebuild3`: すべての計算が終わった後、最後に一回だけ「完成図」を描画します。これでユーザーは結果だけを瞬時に目にすることになります。
—
4. 陥りやすいエラーと回避策
ここで初心者がよくやる失敗が一つあります。それは「エラーハンドリングを忘れること」です。
もし `EnableGraphicsUpdate = False` を実行したあとにコードがエラーで止まったらどうなるでしょう? SolidWorksは「描画しないモード」のまま固まってしまい、ユーザーは「ソフトがフリーズした!」とパニックになります。
必ず `On Error GoTo` を活用してください。
Sub SafeMacro()
On Error GoTo ErrorHandler
‘ 処理開始
swModel.EnableGraphicsUpdate = False
‘ (中略)
‘ 正常終了時
swModel.EnableGraphicsUpdate = True
Exit Sub
ErrorHandler:
‘ エラーが起きても必ず描画を戻す!
swModel.EnableGraphicsUpdate = True
MsgBox “エラーが発生しました。修正してください。”
End Sub
—
最後に:エンジニアとしての一歩先へ
「マクロの記録」で生成されたコードは、あくまで「人間の操作のトレース」です。しかし、今のあなたなら、SolidWorksが裏側でどう動いているのかを制御できるようになりました。
- 描画を止める
- 再構築のタイミングを管理する
- エラー発生時の復旧処理を組み込む
これらは、単なる自動化を超えた「システム設計」の第一歩です。ここをクリアすれば、あなたはもう初学者ではありません。自信を持って、より高度なAPIの世界へ飛び込んでください。
また次のステップで、お会いしましょう!
