SolidWorks VBAを掌握する極限の知見
第1回:コンフィギュレーション名を制する者は、パーツ自動化のモデリングを制す
開発プロジェクトのリーダーである私から、現場で戦うエンジニアのあなたへ伝えたい。
「ボタン一つで3Dモデルが変幻自在に変わるマクロを作りたい」
そう思ってネット上の散らばったコードを継ぎ接ぎし、動くには動くが、少し仕様が変わるとすぐエラーで落ちる――そんな保守性の低いコードに頭を悩ませていないだろうか。
SolidWorks VBAの世界において、最も頻繁に行うミス、そして最も重大なバグの原因は「現在のコンフィギュレーションの状態を正しく把握せず、盲目的にフィーチャを操作すること」にある。
今回は、パーツファイルの命運を握る `ModelDoc2.Extension.GetActiveConfigurationName` を用いた動的取得と、それを実務で絶対に破綻させない条件分岐の極意を伝授しよう。
—
なぜ「現在のコンフィギュレーション名」の取得で失敗するのか?
初心者がやりがちな最大のアンチパターンは、コード内にコンフィギュレーション名をハードコーディング(決め打ち)することだ。
‘ 【悪手】絶対にやってはいけないハードコーディング
Sub BadCode()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
‘ 「Default」という名前を決め打ちしている
If swModel.ConfigurationManager.ActiveConfiguration.Name = “Default” Then
‘ 何らかの処理
End If
End Sub
このコードの何が問題か?
1. ユーザーがコンフィギュレーション名を変更した瞬間(例:「Default」→「製品版_A」)、マクロは沈黙するか予期せぬ挙動を引き起こす。
2. そもそも `ConfigurationManager.ActiveConfiguration` は、大規模アセンブリや複雑なコンフィギュレーションを持つパーツにおいて、APIの内部キャッシュや取得タイミングによって不安定な挙動を示すことがある。
プロのエンジニアであれば、より堅牢で一貫性のある `ModelDoc2.Extension.GetActiveConfigurationName` を採用すべきだ。このメソッドは、ドキュメントの拡張機能(Extension)レベルから、現在アクティブなコンフィギュレーションの文字列を正確かつダイレクトに引き抜く。
—
堅牢な設計:動的取得とセーフティガードの構築
実務で使えるマクロには、「ドキュメントが開かれているか」「それがパーツファイルか」「コンフィギュレーションが正しく取得できたか」という3重のガード(セーフティガード)が必須だ。
以下のプロダクションコードを見てほしい。エラーハンドリングと、取得したコンフィギュレーション名に応じた処理の分岐を完璧に網羅している。
【プロダクションコード】コンフィギュレーション連動型パラメータ制御マクロ
Option Explicit
‘ ==============================================================================
‘ 概要: アクティブなコンフィギュレーション名を動的に取得し、
‘ その名称に応じて処理を分岐・制御する実務向けテンプレート
‘ ==============================================================================
Sub Main_ConfigurationController()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swExt As SldWorks.ModelDocExtension
Dim configName As String
‘ 1. SolidWorksアプリケーションのインスタンス取得
Set swApp = Application.SldWorks
If swApp Is Nothing Then
MsgBox “SolidWorksが起動していません。”, vbCritical, “致命的エラー”
Exit Sub
End If
‘ 2. アクティブドキュメントの取得
Set swModel = swApp.ActiveDoc
If swModel Is Nothing Then
MsgBox “アクティブなドキュメントが存在しません。パーツを開いてください。”, vbExclamation, “警告”
Exit Sub
End If
‘ 3. ドキュメントタイプの検証 (パーツ(swDocPART = 1)以外は弾く)
If swModel.GetType <> swDocPART Then
MsgBox “このマクロはパーツファイル(.sldprt)でのみ実行可能です。”, vbExclamation, “対象外ファイル”
Exit Sub
End If
‘ 4. Extensionオブジェクトの取得とコンフィギュレーション名の動的取得
Set swExt = swModel.Extension
configName = swExt.GetActiveConfigurationName()
‘ 取得失敗時のフェイルセーフ
If configName = “” Then
MsgBox “アクティブなコンフィギュレーション名の取得に失敗しました。”, vbCritical, “APIエラー”
Exit Sub
End If
‘ 5. コンフィギュレーション名に応じた条件分岐(メインロジック)
‘ ※ 大文字・小文字の揺れを防するため UCase関数 で正規化を推奨
Select Case UCase(Trim(configName))
Case UCase(“Default”)
Call ProcessForDefault(swModel)
Case UCase(“Custom_TypeA”), UCase(“Type-A”)
Call ProcessForTypeA(swModel)
Case Else
‘ 未知のコンフィギュレーションが選択されている場合
MsgBox “現在のコンフィギュレーション [” & configName & “] は、このマクロの制御対象外です。”, vbInformation, “通知”
Exit Sub
End Select
‘ 6. 変更をモデルに反映・再構築
swModel.ForceRebuild3 False
MsgBox “処理が正常に完了しました。[Config: ” & configName & “]”, vbInformation, “完了”
End Sub
‘ ==============================================================================
‘ サブルーチン群:各コンフィギュレーションごとの個別処理
‘ ==============================================================================
Private Sub ProcessForDefault(ByRef model As SldWorks.ModelDoc2)
Debug.Print “Defaultコンフィギュレーション用の処理を実行中…”
‘ TODO: ここに特定のフィーチャ抑制解除や寸法変更のコードを記述
‘ 例: model.Parameter(“D1@押出1”).SystemValue = 0.05
End Sub
Private Sub ProcessForTypeA(ByRef model As SldWorks.ModelDoc2)
Debug.Print “TypeAコンフィギュレーション用の処理を実行中…”
‘ TODO: ここに別パターン用のロジックを記述
‘ 例: model.Parameter(“D1@押出1”).SystemValue = 0.1
End Sub
—
チーフアーキテクトからの実践アドバイス:現場で生き残るための3箇条
1. 文字列の「揺れ」を完全排除せよ
ユーザーがコンフィギュレーション名を手動で変更する際、意図せず全角スペースや小文字混じりで入力することがある。コード側で `UCase(Trim(configName))` を通すことで、こうしたヒューマンエラーによるマクロの停止を未然に防ぐ。これがプロの守りだ。
2. 処理は必ずモジュール(サブルーチン)に分割せよ
`Select Case` の中身に直接何十行もコードを書くのは絶対に避けること。将来的な保守の際に見通しが悪くなる。上記のサンプルコードのように、処理ごとに `Private Sub` へ切り出す設計(関心の分離)を徹底せよ。
3. 外部データベースやCSV連携への布石
実務の現場では、取得したコンフィギュレーション名(例: `configName`)をキーにして、外部のExcelやSQLデータベースから「その型番に必要な切削パラメータ」や「材質データ」を動的に引き当て、API経由でモデルへ流し込むというアーキテクチャが主流になる。今回の動的取得はそのすべての土台となる。
—
結びに代えて
コンフィギュレーション名の取得と条件分岐は、一見地味な処理に見えるかもしれない。しかし、ここを雑に設計するか、堅牢に作り込むかで、あなたが組む自動化ツールの「寿命」と「信頼性」は天と地ほどの差が出る。
妥協のないコードを書き、退屈でミスだらけの手作業からエンジニアを解放しよう。
次回も、現場の血肉となる実践的なSolidWorks APIの知見をお届けする。期待して待っていてほしい。
