【入門編】【マクロパフォーマンスの極限追求】DrawingView.KeepLinkedToModelの制御と画面再描画の抑制テクニック – SolidWorks VBA解析バイブル

スポンサーリンク

SolidWorks VBAの極意:数千点の図面を「一瞬」で操る、パフォーマンス最適化の鉄則

こんにちは。日々SolidWorksのAPIと向き合い、数万点の部品を扱う巨大アセンブリを自動化する現場で戦っているエンジニアです。

「マクロの記録」から一歩踏み出し、自力でコードを書き始めた皆さん。「コードを実行した途端、SolidWorksがフリーズしたように止まる」「画面がチラついてイライラする」といった壁にぶつかっていませんか?

それは、あなたがコードを書くのが下手なのではなく、「SolidWorksの心臓部(APIのライフサイクル)」をまだコントロールできていないだけです。今日は、プロが現場で必ず行っている「高速化の極意」を伝授します。

1. なぜマクロは重くなるのか?

SolidWorksのAPIは、実行するたびに「再計算」や「画面の更新」を律儀に行おうとします。
例えば、100個の図面ビューのプロパティを書き換える時、毎回画面を更新していたら、PCは「描画→計算→描画→計算…」の無限ループで悲鳴を上げます。

これを止めるのが、「更新の抑制」と「リソースの解放」です。

2. 画面再描画を封印する(AutoRedrawとDisableUpdates)

まず基本中の基本。処理中は「画面を更新しない」。これが鉄則です。

‘ スコープの開始
Dim swApp As SldWorks.SldWorks
Set swApp = Application.SldWorks

‘ ① 画面の更新を完全停止
swApp.UserControl = False ‘ ユーザー操作を無効化(誤操作防止)
swApp.Visible = True ‘ アプリ自体は見せるが…
swApp.Frame.KeepAlive = True

‘ ② 最も重要な「再描画の抑制」
swApp.AutoRedraw = False
swApp.EnableGraphicsUpdate = False ‘ 画面のレンダリングを停止

なぜこれをするのか?

`AutoRedraw = False` にすることで、SolidWorksは「裏側でデータだけを書き換え、画面への反映は後回しにする」モードになります。これにより、処理速度は劇的に向上します。

3. KeepLinkedToModel:図面ビューの「重さ」の正体

図面ビューにおいて、`KeepLinkedToModel` は諸刃の剣です。
モデルとリンクさせ続ける(True)ことは安全ですが、大量のビューを操作する際、常にモデルへの参照を確認しに行くと処理が著しく重くなります。

現場のテクニック:
バッチ処理の最中は、一時的にリンクを切り離すか、あるいは「ビューの更新」を明示的に制御します。

‘ 図面ビューの制御例
Dim swDraw As SldWorks.DrawingDoc
Dim swView As SldWorks.View

Set swDraw = swApp.ActiveDoc
Set swView = swDraw.GetFirstView.GetNextView ‘ シートの次のビューを取得

‘ ビューのリンク設定を制御
‘ 注意: モデルとのリンクを完全に切ると図面が壊れる可能性があるため、
‘ 更新が必要な時だけ制御するのがプロのやり方です
swView.KeepLinkedToModel = False
‘ … ここでプロパティ書き換え …
swView.KeepLinkedToModel = True

4. プロの「後始末」:メモリとオブジェクトの解放

初心者と中級者の決定的な違いは、「最後のリセット」です。
SolidWorksのAPIはメモリを非常に多く消費します。処理が終わった後、適切に解放しなければ、次に起動した時に動作が重くなる「メモリリーク」が発生します。

‘ — 処理の最後に必ず記述 —
‘ 再描画を許可
swApp.AutoRedraw = True
swApp.EnableGraphicsUpdate = True

‘ 最後に強制再描画(これをしないと画面がバグることがあります)
swDraw.ForceRebuild3

‘ オブジェクトの明示的解放(VBAではSet Nothingが礼儀)
Set swView = Nothing
Set swDraw = Nothing

【まとめ】明日からのコードに組み込むチェックリスト

1. 冒頭で `AutoRedraw = False` にしたか?
2. ループの直前で `EnableGraphicsUpdate = False` にしたか?
3. エラーハンドリング(On Error GoTo)で、エラー時でも必ず `AutoRedraw = True` に戻るようになっているか?(これがないと、エラー終了後に画面が真っ白のままになります!)
4. 最後に `Set = Nothing` でメモリを掃除したか?

これらを意識するだけで、あなたのマクロは「趣味のスクリプト」から「現場の強力なツール」へと進化します。

SolidWorksのAPIは、まるで巨大な機械を操縦するようなものです。まずは「機械を止める(抑制する)」技術から習得してください。それができれば、どんな複雑なモデルもあなたの思い通りに動かせるようになりますよ。

また次の講義でお会いしましょう。健闘を祈ります!

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