【入門編】【上級プロ】アセンブリのロード時間短縮:Large Assembly Mode(大規模アセンブリモード)のVBAプログラムからの強制制御と軽量化 – SolidWorks VBA解析バイブル

スポンサーリンク

こんにちは!SolidWorks VBAの世界へようこそ。
日々、何百もの部品が組み合わさった巨大なアセンブリと格闘していませんか?

「マクロを実行した途端、SolidWorksがフリーズしたように固まる…」
「メモリがパンクして強制終了してしまう…」

そんな地獄のような経験、あなたにもあるはずです。マクロの記録をポチポチ押して作ったコードをそのまま大容量アセンブリに流し込むのは、「目隠しをしたままフェラーリで暴走する」ようなもの。APIの挙動とメモリのライフサイクルを理解していないと、確実にクラッシュします。

今回は、数万点規模の巨大アセンブリをも軽快に操り、バッチ処理を爆速で終わらせるための「大規模アセンブリモード(Large Assembly Mode)」のプログラム制御と極限の軽量化テクニックを授けましょう。

ここをクリアすれば、あなたのVBAスキルは間違いなくプロの領域に到達します。さあ、一緒に扉を開けましょう!

—

1. なぜ巨大アセンブリのVBA処理は重いのか?(本質を知る)

私たちが普段何気なく開いているアセンブリファイル(`.sldasm`)。これをVBAから無防備に`OpenDoc6`などで開くと、SolidWorksはデフォルトで以下の「重労働」を裏で行います。

  • すべての部品のグラフィックスデータをフル精度で生成する
  • すべての合致(Mate)の数理的干渉やソリューションを再計算する
  • 図面や外部参照のリンクをすべてチェックする

人間が手動で作業する分には「読み込み待ち」で済みますが、これをVBAの自動バッチ処理で何十ファイルもやると、メモリリークとGC(ガベージコレクション)の遅延により確実に沈没します。

ここで救世主となるのが、「大規模アセンブリモード」と「軽量(Lightweight)モード」、そして「ドキュメント非表示(Silent/Invisible)制御」です。これらをAPIから強制的にねじ込むのが、今回のテーマです。

—

2. 【極意】APIで大規模アセンブリモードを強制発動する

まずは、SolidWorksのシステム設定やドキュメントを開く前の段階で「大規模アセンブリモード」の閾値をコードから操作し、さらにグラフィックスの描画を完全に断つテクニックを見てみましょう。

以下のコードは、実務でそのまま使える堅牢なアセンブリ処理のテンプレートです。

Option Explicit

‘ メイン処理:大規模アセンブリを高速かつ安全にバッチ処理するプロシージャ
Sub ProcessMassiveAssembly_Pro()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim filePath As String
Dim openError As Long
Dim openWarning As Long

‘ 1. アプリケーションインスタンスの取得
Set swApp = Application.SldWorks
If swApp Is Nothing Then
MsgBox “SolidWorksが起動していません。”, vbCritical
Exit Sub
End If

filePath = “C:\YourFolder\HugeAssembly_2023.sldasm”

‘ 2. 【最重要】画面描画とバックグラウンド処理の停止(パフォーマンス爆速化の基本)
swApp.Visible = True ‘ アプリ自体は消さないが、描画を止める
swApp.UserControl = False

‘ システム設定で「大規模アセンブリモード」のしきい値(例: 50部品以上)を強制的に下回らせ、常に有効にする
‘ ※環境に合わせて数値を調整してください
swApp.SetUserPreferenceIntegerValue swLargeAssemThreshold, 10
swApp.SetUserPreferenceToggleValue swLargeAssemSetting_AutomaticLoadLightweight, True

‘ 3. 開く際のオプション設定(軽量モードでのロード、かつUI非表示でメモリ節約)
‘ swOpenDocOptions_Silent : ダイアログを出さずに裏で開く
‘ swOpenDocOptions_LoadLightweight : すべての部品を軽量状態で開く(メモリ消費を極小に!)
Dim loadOptions As Long
loadOptions = swOpenDocOptions_Silent Or swOpenDocOptions_LoadLightweight

‘ 4. ドキュメントのオープン実行
Dim docType As Long
docType = swDocASSEMBLY

Debug.Print “— 処理開始: ” & Now
Set swModel = swApp.OpenDoc6(filePath, docType, loadOptions, “”, openError, openWarning)

If swModel Is Nothing Then
MsgBox “ファイルのオープンに失敗しました。エラーコード: ” & openError, vbCritical
Exit Sub
End If

‘ 5. ここにアセンブリに対する自動化処理(合致の追加やプロパティ変更など)を記述
Call ExecuteHeavyOperations(swModel)

‘ 6. 変更を保存してクリーンアップ
swModel.Save3 swSaveAsOptions_Silent, openError, openWarning
swApp.CloseDoc swModel.GetTitle

‘ 7. 設定を元に戻す
swApp.UserControl = True

Debug.Print “— 処理終了: ” & Now
MsgBox “大規模アセンブリのバッチ処理が正常に完了しました!”, vbInformation

End Sub

‘ ダミー:重い処理を行うプロシージャ
Sub ExecuteHeavyOperations(ByRef swModel As SldWorks.ModelDoc2)
Dim swAssDoc As SldWorks.AssemblyDoc
Set swAssDoc = swModel

‘ 例:コンポーネントの再構築(軽量状態のまま最小限の操作に留める)
‘ 大規模アセンブリでは swModel.EditRebuild3 ではなく、強制再構築を避けるのがコツ
swAssDoc.ResolveAllLightweightComponents False ‘ 必要なら部分的に解決するが、極力避ける

‘ ここに合致追加や部品置換のロジックが入ります

End Sub

コードのここがポイント!

  • `swOpenDocOptions_LoadLightweight`: 部品の詳細ジオメトリを読み込まず、外形データだけをメモリに載せることで、メモリ消費量を数分の一に抑えます。
  • `swOpenDocOptions_Silent`: エラーダイアログや警告モーダルによる「マクロのフリーズ(止まりっぱなし現象)」を完全に出なくします。バッチ処理の命綱です。

—

3. 初学者が必ずハマる!「オブジェクトの解放」とメモリリークの罠

大規模アセンブリをVBAで扱う際、最も恐ろしいのは「メモリリーク」です。
ループを回して何個ものアセンブリを次々に処理していくマクロを書いたとき、コードの書き方が悪いと、10個目を処理するあたりでSolidWorksが突然落ちます。

❌ 悪い例(メモリがドロドロに溶ける書き方)

For i = 1 to 100
Set swModel = swApp.OpenDoc6(path(i), …)
‘ 処理…
‘ (ループの次の周回で、古い swModel 変数が上書きされるが、SolidWorks内部の参照が残る)
Next i

⭕ 正しい例(プロのメモリ管理)

オブジェクトを使い終わったら、必ずメモリから明示的に破棄(解放)し、変数を`Nothing`にしてください。

Dim swModel As SldWorks.ModelDoc2
Dim swAssDoc As SldWorks.AssemblyDoc

For i = 1 to 100
Set swModel = swApp.OpenDoc6(path(i), swDocASSEMBLY, swOpenDocOptions_Silent, “”, err, warn)

If Not swModel Is Nothing Then
‘ 処理の実行
Set swAssDoc = swModel
‘ … 処理 …

‘ 閉じる
swApp.CloseDoc swModel.GetTitle
End If

‘ 【極意】参照を完全に断ち切る
Set swAssDoc = Nothing
Set swModel = Nothing

‘ ガベージコレクションを促す(VBAレベルでのメモリ整理)
DoEvents
Next i

この「使い終わったら `Nothing` を代入して参照を切る」という一手間が、何時間も走るバッチ処理を途中でクラッシュさせないための絶対防衛ラインです。

—

4. まとめ:ここをクリアすれば、SolidWorks VBAの基本はバッチリ!

お疲れ様でした!今回は少しディープな、しかし実務では避けて通れない「大規模アセンブリのパフォーマンス制御」について解説しました。

ここまでのポイントを振り返ってみましょう。

1. 大規模アセンブリモード・軽量モードの強制活用で、不要なメモリ消費を物理的にシャットアウトする。
2. `swOpenDocOptions_Silent` を使って、ダイアログによるマクロの停止を防ぎ、完全無人化(バッチ化)を実現する。
3. 処理が終わったドキュメントは必ず `CloseDoc` し、変数を `Nothing` でクリアしてメモリリークを防ぐ。

この3つをマスターしたあなたなら、もう「重いアセンブリだからVBAは無理だ…」と諦める必要はありません。どんなに巨大なモデルであっても、背後でスマートに、圧倒的な速度で処理を完遂できるプログラミングエンジニアになれます。

現場の自動化をさらに加速させて、定時退社を勝ち取りましょう!
それでは、次のステップでお会いしましょう。

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