【入門編】【パフォーマンス改善】ModelDoc2.ClearSelection2とUserControlの組み合わせによるメモリリーク防止と長時間バッチの安定化 – SolidWorks VBA解析バイブル

スポンサーリンク

SolidWorks VBAを掌握する:数千個のパーツ生成を「止まらない」バッチにする技術

こんにちは。SolidWorksの自動化を極める旅路へようこそ。

「マクロの記録」でコードを生成し、いざ数百、数千個のパーツを作成する自動化に挑むと、必ず直面する壁があります。それは「処理が進むにつれてSolidWorksが重くなり、最終的にフリーズするか、メモリ不足で落ちる」という悪夢です。

これはあなたのPCの性能が低いせいではありません。SolidWorksのAPI、特に「選択(Selection)」と「メモリ管理」の作法を正しく理解していないことが原因です。

今日は、伝説的なエンジニアたちが現場で必ず実装している、「メモリリークを根絶し、長時間バッチを完遂させるための鉄則」を伝授します。

1. なぜ「選択バッファ」がメモリを食いつぶすのか

SolidWorksでフィーチャを追加したり、面を選択したりするたびに、APIは「何が選択されているか」という情報を内部メモリ(選択バッファ)に蓄積します。

ループ処理で数千回もこれを繰り返すと、「過去の選択情報の亡霊」がメモリを占拠し続けます。SolidWorksはこれを自力で完璧には片付けてくれません。放置すれば、メモリリークの温床となり、やがてSolidWorksは「沈黙(フリーズ)」を選択します。

解決策の核心:ClearSelection2(True)

ループの区切り、あるいはオブジェクトを解放する直前で、明示的にバッファを掃除する。これが「止まらないバッチ」の第一歩です。

2. 実践:メモリをクリーンに保つためのコードテンプレート

以下は、数千個のパーツを連続生成する際に必須となる、メモリ管理を組み込んだテンプレートです。

Option Explicit

Sub BatchPartGenerator()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim i As Long

Set swApp = Application.SldWorks

‘ 長時間バッチでは、UIの更新を止めることで速度を劇的に向上させる
swApp.UserControl = False ‘ SolidWorksをバックグラウンド操作モードへ
swApp.Visible = True ‘ 処理は見せるが、操作は受け付けない

For i = 1 To 1000
‘ 新規作成
Set swModel = swApp.NewDocument(“Part”, 0, 0, 0)

‘ — ここにフィーチャ生成処理を記述 —
‘ 例: 押し出し、スケッチなど

‘ 【重要】処理の節目で選択バッファを完全クリア
swModel.ClearSelection2 True

‘ ドキュメントの保存とクローズ
swModel.SaveAs2 “C:\Temp\Part_” & i & “.sldprt”, 0, False, False
swApp.CloseDoc swModel.GetTitle

‘ オブジェクトの明示的解放(メモリの断片化を防ぐ)
Set swModel = Nothing

‘ GC(ガベージコレクション)を促す小休憩(必要に応じて)
DoEvents
Next i

‘ 処理終了後、UI制御を戻す
swApp.UserControl = True
MsgBox “全パーツの生成が完了しました。”
End Sub

3. ここで陥りやすい「落とし穴」

① `UserControl = False` の罠

`UserControl`を`False`にすると、SolidWorksは「外部から制御されているプログラム」として認識されます。これにより、UIのレンダリング負荷が下がり、処理速度が飛躍的に向上します。しかし、バッチ完了後に必ず `True` に戻さないと、SolidWorksを閉じられなくなるので注意してください。

② `Set swModel = Nothing` の過信

VBAには強力なメモリ管理機能がないため、`Nothing`を代入しても即座にメモリが解放されるわけではありません。しかし、次のループで新しいドキュメントを作成する前に、古い参照を切り離すことは、メモリリークを抑えるための「礼儀」です。

③ `DoEvents` の意味

これはOSに対して「今、他の処理(マウス操作など)を受け付ける隙間をあげるよ」という合図です。数千回のループの中にこれを入れることで、SolidWorksが「応答なし」になるのを防ぎます。

4. 最後に:エンジニアとしての心得

「マクロの記録」は、あくまでAPIを学ぶための入門編に過ぎません。真の自動化エンジニアは、「マクロがどのようにPCリソースを消費するか」を想像しながらコードを書きます。

1. ClearSelection2(True) を忘れない。
2. UserControl を使いこなす。
3. ループのたびにリソースをクリーンな状態にリセットする。

この3点を守るだけで、あなたのバッチ処理は、どんなに大規模なプロジェクトでも一度も止まることなく完走するようになります。

プログラミングは、魔法ではなく論理です。一つひとつのオブジェクトのライフサイクルを丁寧に管理してあげれば、SolidWorksは最高の相棒として、あなたの想像を超えるスピードで応えてくれます。

さあ、次はあなたの番です。コードを書いて、SolidWorksをあなたの手足のように操りましょう。応援しています!

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