【上級プロ】アセンブリのロード時間短縮:Large Assembly ModeのVBAプログラムからの強制制御と軽量化
フランクに言おう。数百点、数千点を超える巨大なアセンブリファイルをVBAでバッチ処理する際、デフォルト設定のまま`OpenDoc6`を叩いていないか?
「処理が途中でフリーズする」「メモリリークでExcelごと落ちる」「描画処理が重すぎてイライラする」――もしあなたがこの壁にぶ当たっているなら、原因はコードの書き方ではない。「SolidWorksのセッション管理と大規模アセンブリの思想」を理解していないことが全ての元凶だ。
今回は、開発プロジェクトのリーダーである私が、VBAから大規模アセンブリモード(Large Assembly Mode)を強制制御し、メモリ消費を極限まで削ぎ落として爆速バッチ処理を実現する極意を伝授する。
—
1. なぜ「普通のオープン」では巨大アセンブリに太刀打ちできないのか
SolidWorksをUI(画面)から起動し、巨大なアセンブリを開くとき、バックグラウンドでは膨大なリソースが消費される。
- 全構成部品の完全な形状データの展開
- 詳細な図形アソシエーション(参照関係)の構築
- リアルタイムなビューポートの再描画(Graphics Update)
これをVBAの自動化スクリプトで無防備に実行するとどうなるか。APIはデフォルトで「人間が画面操作するのと同じ重たい処理」をバックグラウンドで忠実に再現しようとする。結果、メモリは枯渇し、COMオブジェクトの解放漏れと相まって、数ファイル処理しただけでSolidWorksが沈黙する。
プロのエンジニアが取るべきアプローチは明確だ。
「描画を止め、軽量化モードを強制し、必要最小限のデータだけをメモリに載せる」。 これをVBAからAPIでコントロールする。
—
2. 極限軽量化の3大柱
VBAから大規模アセンブリを統御するためには、以下の3つの要素をコードに組み込む必要がある。
1. Large Assembly Mode(大規模アセンブリモード)の強制有効化
- システムオプションおよびドキュメントレベルの閾値をVBAから上書きし、軽量化の恩恵を強制的に引き出す。
2. 画面描画の完全抑制(Visible = False / DisplayWhenOpening = False)
- 人間には見えないバックグラウンドで処理を完結させ、GPUとCPUの描画コストをゼロにする。
3. 軽量部品(Lightweight)としてのロード
- 形状の数学的定義(BREP)ではなく、ファセット(軽量表示データ)のみを読み込み、メモリフットプリントを劇的に削減する。
—
3. 【プロダクションコード】爆速バッチ処理のテンプレート
実務でそのまま使える、堅牢性とパフォーマンスを極限まで高めたVBAコードを提供する。エラーハンドリングとCOMオブジェクトの解放(メモリ管理)も完璧に網羅している。
Option Explicit
‘ ==============================================================================
‘ 大規模アセンブリ爆速バッチ処理エンジン
‘ 概要: メモリ消費を極限まで抑え、Large Assembly Modeを強制してアセンブリを開く
‘ ==============================================================================
Sub ExecuteHighSpeedAssemblyProcess()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim targetPath As String
Dim fileError As Long
Dim fileWarning As Long
‘ 処理対象ファイルのパス(実環境に合わせて変更してください)
targetPath = “C:\Data\LargeAssembly_Sample.sldasm”
‘ 1. SolidWorks アプリケーションのインスタンス取得
Set swApp = CreateObject(“SldWorks.Application”)
If swApp Is Nothing Then
MsgBox “SolidWorksが起動していません。”, vbCritical
Exit Sub
End If
‘ 2. 【最重要】バックグラウンド処理化と描画の完全停止
‘ 画面描画を隠すことで、ビューポート更新のオーバーヘッドを消し去る
swApp.Visible = False
‘ 3. 大規模アセンブリ設定の強制適用(システムオプションの書き換え)
Call ConfigureLargeAssemblySettings(swApp)
On Error GoTo ErrorHandler
‘ 4. ドキュメントオープン時のオプション設定
‘ ・軽量モードで開く (swOpenDocOptions_LoadLightweight)
‘ ・参照ファイルを読み込まない、または必要最小限に
Dim openOptions As Long
openOptions = swOpenDocOptions_Silent _
+ swOpenDocOptions_LoadLightweight _
+ swOpenDocOptions_AutoLoadReferences
‘ 5. ファイルのオープン実行
Dim docType As Long
docType = swDocASSEMBLY
Set swModel = swApp.OpenDoc6(targetPath, docType, openOptions, “”, fileError, fileWarning)
If swModel Is Nothing Then
MsgBox “アセンブリのオープンに失敗しました。エラーコード: ” & fileError, vbCritical
GoTo Finally
End If
‘ — ここに大規模アセンブリに対する自動化処理を記述 —
‘ 例: 全コンポーネントのトラバーサルやプロパティ変更など
Debug.Print “アセンブリのロード成功: ” & swModel.GetPathName
‘ 変更を保存して閉じる場合
‘ swModel.Save3 swSaveAsOptions_Silent, fileError, fileWarning
‘ 6. ドキュメントのクローズ
swApp.CloseDoc swModel.GetTitle
Set swModel = Nothing
Finally:
‘ 7. 確実にSolidWorksの表示を戻し、COMオブジェクトを解放
swApp.Visible = True
Set swApp = Nothing
Exit Sub
ErrorHandler:
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical
Resume Finally
End Sub
‘ ==============================================================================
‘ 大規模アセンブリモードのしきい値およびシステムの高速化設定
‘ ==============================================================================
Private Sub ConfigureLargeAssemblySettings(ByRef app As SldWorks.SldWorks)
‘ 大規模アセンブリモードのしきい値(構成部品数)を「1」に強制設定し、
‘ 常に大規模アセンブリ用の最適化ロジックを強制発動させる
app.SetUserPreferenceIntegerValue swLargeAssemblyThreshold, 1
‘ 自動軽量化を有効化
app.SetUserPreferenceToggle swLargeAssemblyModeEnabled, True
‘ 外部参照の更新を抑制
app.SetUserPreferenceToggle swExternalReferencesUpdateAll, False
‘ 図面の自動再構築を抑制
app.SetUserPreferenceToggle swRebuildOnActivation, False
End Sub
—
4. チーフアーキテクトからの実務アドバイス:なぜこの設計なのか?
① `swOpenDocOptions_Silent` と `swOpenDocOptions_LoadLightweight` のコンボ
バッチ処理においてダイアログのポップアップ(「ファイルが見つかりません」「参照が壊れています」等)は致命傷だ。`Silent`を指定してエラーを握りつぶし、かつ`LoadLightweight`でメモリ消費を数分の一に抑える。この2つはセットでなければならない。
② `swLargeAssemblyThreshold` を強制的に「1」にする理由
デフォルトでは、SolidWorksは構成部品数が一定数(例: 500点)を超えないと大規模アセンブリモードを発動しない。しかし、VBAで処理する対象がたとえ200点であっても、メモリ効率と速度を最大化したいのであれば、しきい値を強制的にお手元のコードで `1` に上書きするべきだ。これにより、部品数が少ないアセンブリであっても常に最速のセッションプロファイルで動作させることができる。
③ COMオブジェクトのゾンビ化を防ぐ徹底した解放
VBAとSolidWorks APIの連携において最も恐ろしいのは、VBAのエラーや強制終了によってSolidWorksのプロセス(SLDWORKS.exe)がタスクマネージャーに残骸として居座り続ける現象(ゾンビプロセス)である。
上記のコードでは、`On Error GoTo`構文を使い、いかなる例外が発生しようとも必ず `Finally` ラベルを経由して `swApp.Visible = True` に戻し、インスタンス変数に `Nothing` を代入してメモリ解放を促す堅牢なライフサイクル管理を行っている。
—
5. おわりに
巨大なアセンブリを扱うVBA開発は、単なるAPIのメソッドつなぎ合わせではない。SolidWorksのアーキテクチャの急所を突く、極めてインフラストラクチャに近いエンジニアリングだ。
今回紹介した「大規模アセンブリモードの強制制御」と「バックグラウンド軽量ロード」をあなたのツールに組み込めば、これまで数十分かかっていたバッチ処理が、嘘のように数分(あるいは数秒)で完了するはずだ。
現場のエンジニアを無駄な待ち時間から解放し、真の自動化の価値を届けてほしい。健闘を祈る。
