SolidWorks VBAを掌握する極限の知見
【コンフィギュレーション連携】ConfigurationManager.AddConfiguration2を用いた派生コンフィギュレーションの階層的自動生成
シニアエンジニアおよび社内システム管理者の各位。
日々の設計自動化において、数多のパーツバリエーション生成に消耗していないだろうか。
「マスターモデルから、寸法や仕様違いの子コンフィギュレーションを何十個も手動でぶら下げる」
「VBAでコンフィギュレーションを追加したはいいが、依存関係が崩れ、親の変更が子に伝播しない」
「メモリリークやCOMオブジェクトの解放漏れにより、大規模アセンブリ展開時にSolidWorksが沈黙する」
これらは、APIの表面的なメソッドを叩くだけの素人プログラミングが招く必然の悲劇である。
SolidWorksのコンフィギュレーション構造、特に「親コンフィギュレーションと子コンフィギュレーション(派生)の依存関係」の本質を理解していれば、このような非効率は一掃できる。
今回は、`ConfigurationManager.AddConfiguration2`を駆使し、階層的なコンフィギュレーションツリーを極限まで高速かつ堅牢に自動生成するアーキテクチャを提示する。
—
1. 根幹理論:なぜ「派生コンフィギュレーション」の階層化が必要なのか?
大規模なプラント設計や規格化された筐体設計において、パーツのバリエーション管理は命綱だ。
フラットな構造で無数のコンフィギュレーションを並列に並べると、以下の致命的な問題が発生する。
1. データ冗長性の増大: 共通するパラメータの変更漏れ。
2. 依存関係の喪失: 「基本型」→「A仕様」→「A-1オプション」という設計意図(インヘリタンス)がUI上から消失する。
3. API操作の破綻: `AddConfiguration2`の引数設計を誤ると、意図しないルートコンフィギュレーションが乱立する。
`AddConfiguration2`の第5引数(親コンフィギュレーション名)を完全に制御し、「マスター > ファミリー > バリエーション」という厳格なツリー構造をVBAから構築する。これが、真にメンテナンス性の高いCAD自動化の基盤である。
—
2. 実装アーキテクチャの要件定義
今回の実戦用コードでは、以下のエンジニアリング要件を満たす。
- 完全修飾によるオブジェクトの明示的解放: COMラッパーのゾンビ化を防ぎ、メモリフットプリントを最小化する。
- エラーハンドリングと状態復帰: 存在しない親を指定した場合のトラップと、処理中の画面描画凍結(`Visible` / `UserControl`制御)による圧倒的な高速化。
- 多次元配列による設定データの駆動: 外部定義(またはハードコードされた配列)から、一括して階層を構築するスケーラブルな設計。
—
3. 実戦コード:階層的コンフィギュレーション自動生成エンジン
以下のコードをSolidWorks VBAの標準モジュールに実装せよ。実務での即時利用を想定し、冗長なエラー処理を削ぎ落とし、APIの急所を突く実装としている。
Option Explicit
‘ ==============================================================================
‘ 処理名: 階層的コンフィギュレーション一括生成エンジン
‘ 概要 : ConfigurationManager.AddConfiguration2 を用いて、親子関係を維持した
‘ 派生コンフィギュレーションツリーを構築する。
‘ ==============================================================================
Sub ExecuteHierarchicalConfigurationGeneration()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swConfMgr As SldWorks.ConfigurationManager
‘ 1. アプリケーションおよびドキュメントの安全な取得
Set swApp = Application.SldWorks
If swApp Is Nothing Then
MsgBox “SolidWorksが起動していません。”, vbCritical
Exit Sub
End If
Set swModel = swApp.ActiveDoc
If swModel Is Nothing Then
MsgBox “アクティブなパーツまたはアセンブリが存在しません。”, vbCritical
Exit Sub
End If
‘ アクティブドキュメントがパーツかアセンブリか検証 (dwDocumentTypes_e)
If swModel.GetType <> swDocPART And swModel.GetType <> swDocASSEMBLY Then
MsgBox “このマクロはパーツまたはアセンブリでのみ実行可能です。”, vbExclamation
Exit Sub
End If
Set swConfMgr = swModel.ConfigurationManager
If swConfMgr Is Nothing Then
MsgBox “ConfigurationManagerを取得できませんでした。”, vbCritical
Exit Sub
End If
‘ 2. パフォーマンス最適化:画面描画と再構築の凍結
swModel.Extension.Use洙ConfigurationNotice = False
swApp.SetUserPreferenceToggle swUserPreferenceToggle_e.swViewUpdateSpeedsUp, False
‘ トランザクションの開始(パフォーマンスとアトミック性の確保)
swModel.ClearSelection2 True
On Error GoTo ErrorHandler
‘ 3. 階層データの定義 (親コンフィギュレーション, 子コンフィギュレーション, 説明, オプション)
‘ ※実務ではCSVや外部DB、Excelから動的にこの配列を生成すること
Dim configData(1 To 4, 1.4) As String
‘ [行1]: ルート直下の親グループ
configData(1, 1) = “Default”: configData(1, 2) = “Series_A”: configData(1, 3) = “Series A Master”: configData(1, 4) = “0” ‘ swConfiguration_Standard
‘ [行2]: Series_A の子(派生)
configData(2, 1) = “Series_A”: configData(2, 2) = “Type_A1”: configData(2, 3) = “A1 Variation”; configData(2, 4) = “1” ‘ swConfiguration_Derived
‘ [行3]: Type_A1 の孫(多段派生)
configData(3, 1) = “Type_A1”: configData(3, 2) = “Type_A1_SpecX”: configData(3, 3) = “A1 Spec X”; configData(3, 4) = “1” ‘ swConfiguration_Derived
‘ [行4]: 別系統の親グループ
configData(4, 1) = “Default”: configData(4, 2) = “Series_B”: configData(4, 3) = “Series B Master”: configData(4, 4) = “0” ‘ swConfiguration_Standard
Dim i As Long
Dim parentName As String
Dim childName As String
Dim desc As String
Dim isDerived As Long
Dim resultConfig As SldWorks.Configuration
‘ 4. ループ処理による階層構築
For i = LBound(configData, 1) To UBound(configData, 1)
parentName = configData(i, 1)
childName = configData(i, 2)
desc = configData(i, 3)
isDerived = CLng(configData(i, 4))
‘ 既に同名のコンフィギュレーションが存在するかチェックし、重複作成を防ぐ
If Not ConfigurationExists(swModel, childName) Then
‘ 【極限のポイント】 AddConfiguration2 の引数仕様
‘ AddConfiguration2(ConfigName, Comment, AlternateName, Options, ParentConfigName, UseAlternateNameInBOM)
Set resultConfig = swConfMgr.AddConfiguration2( _
childName, _
desc, _
“”, _
isDerived, _
parentName, _
False _
)
If resultConfig Is Nothing Then
Debug.Print “[WARNING] コンフィギュレーションの生成に失敗: ” & childName & ” (親: ” & parentName & “)”
Else
Debug.Print “[SUCCESS] 生成完了 -> ” & childName & ” (親: ” & parentName & “)”
End If
Else
Debug.Print “[INFO] スキップ(既に存在) -> ” & childName
End If
Next i
‘ 5. 変更の適用とビューの復元
swModel.ForceRebuild3 False
GoTo CleanUp
ErrorHandler:
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical
CleanUp:
‘ パフォーマンス設定の復元
swApp.SetUserPreferenceToggle swUserPreferenceToggle_e.swViewUpdateSpeedsUp, True
swModel.Extension.Use洙ConfigurationNotice = True
‘ COMオブジェクトの明示的解放(メモリ最適化)
Set resultConfig = Nothing
Set swConfMgr = Nothing
Set swModel = Nothing
‘ swAppはアプリケーションスコープのため解放しない
MsgBox “コンフィギュレーションの階層展開が完了しました。”, vbInformation
End Sub
‘ ==============================================================================
‘ 補助関数: 指定したコンフィギュレーションが既に存在するか判定
‘ ==============================================================================
Private Function ConfigurationExists(ByVal swModel As SldWorks.ModelDoc2, ByVal configName As String) As Boolean
Dim vConfNames As Variant
Dim i As Long
vConfNames = swModel.GetConfigurationNames()
If IsEmpty(vConfNames) Then
ConfigurationExists = False
Exit Function
End If
For i = LBound(vConfNames) To UBound(vConfNames)
If CStr(vConfNames(i)) = configName Then
ConfigurationExists = True
Exit Function
End If
Next i
ConfigurationExists = False
End Function
—
4. チーフアーキテクトが解説する「死角のない実装」の技術的根拠
① `AddConfiguration2` の第4引数と第5引数の厳密な同期
コード内の `configData(i, 4)` に注目してほしい。
- `0` を指定した場合:ルート(独立した)コンフィギュレーションとして生成される。
- `1` を指定した場合:第5引数 (`ParentConfigName`) で指定した親コンフィギュレーションの「派生(Derived)」として生成される。
もし親がルートに存在しない、あるいは名前が一致しない場合、APIは沈黙するか予期せぬデフォルト親に紐づく。そのため、事前に配列定義やDB側でツリー構造のトポロジ(接続関係)を完全に整合させておく必要がある。
② COMオブジェクトの生存管理とメモリ最適化
VBAにおける最大の悪習は、`Set` したオブジェクトをそのまま放置することだ。
SolidWorks APIを大量に叩くループ処理において、一時オブジェクト(`Configuration` や `ModelDocExtension` など)の解放漏れは、GC(ガベージコレクション)のタイミング次第でメモリリークを引き起こし、数千回の反復処理の果てにSolidWorksをクラッシュさせる。
コードの最後にある `Set resultConfig = Nothing` 等の明示的な参照切断は、大規模モデルを扱うシステムにおいて絶対に省いてはならない防壁である。
③ 高速化のための描画・再構築ブロック
`swModel.ForceRebuild3 False` や `SetUserPreferenceToggle` による画面更新の抑制は、数秒単位の処理時間をコンマ何秒へと劇的に圧縮する。ユーザーが画面のちらつきを見ている間にCPUが悲鳴を上げるようなレガシーな設計は、もはやエンジニアリングの恥と心得よ。
—
5. まとめ
今回解説した `ConfigurationManager.AddConfiguration2` を用いた階層的自動生成の知見は、単なるパーツ作成の効率化に留まらない。
PDMシステムや外部ERP、BOMシステムとの連携基盤において、「意図した形状の遺伝関係をコードで完全に担保する」という、CADアーキテクチャの根幹をなす技術である。
表面的・場当たり的なVBAコードの卒業をここに宣言し、揺るぎない自動化システムを構築してほしい。健闘を祈る。
