【実務・中級編】【初心者向け】SldWorks.ModelDoc2からGetCurrentConfigurationで現在のコンフィギュレーション名を取得し分岐処理を行う基本 – SolidWorks VBA解析バイブル

スポンサーリンク

こんにちは。チーフアーキテクトの私だ。
今回は、SolidWorks VBA開発において最も頻繁に遭遇し、かつ雑に扱いがちなテーマを取り上げる。
「現在アクティブなコンフィギュレーション名の取得と、それに基づく条件分岐」だ。

「なんだ、`GetCurrentConfiguration`を呼ぶだけじゃないか」と思ったそこの君。
その慢心が、現場で「特定のコンフィギュレーションでのみエラーが起きる」「アセンブリ側から叩いたときに想定外のモデルをいじってしまう」という、言い訳不能なバグを生む温床となっていることに気づいているか?

今回は、単なるAPIの使い方のおさらいではない。
「実務の現場で絶対に破綻しない、堅牢で美しいコンフィギュレーション制御の極意」を叩き込む。心して読め。

1. なぜコンフィギュレーション判定でバグが頻発するのか?

SolidWorksのパーツファイル(`.sldprt`)やアセンブリファイル(`.sldasm`)を操作する際、私たちは常に「今、どの世界線(コンフィギュレーション)にいるのか」を意識しなければならない。

初心者がやりがちな最悪のパターンがこれだ。

‘ 【反面教師のアンチパターン】
Dim swModel As SldWorks.ModelDoc2
Set swModel = swApp.ActiveDoc

‘ いきなり名前を取得して文字列比較
Dim configName As String
configName = swModel.GetCurrentConfiguration()

If configName = “Default” Then
‘ 何らかの処理
End If

これの何が問題か?
1. `swModel` が Nothing の可能性を考慮していない(図面が開いている時や、ドキュメントがゼロ枚の時に一撃でクラッシュする)。
2. アクティブドキュメントが本当にパーツ・アセンブリなのか検証していない(図面ドキュメントのシートをアクティブにしている時にこれをやると予期せぬ挙動を引き起こす)。
3. コンフィギュレーション名の大文字・小文字、あるいは前後のスペースの揺れを考慮していない。

プロのエンジニアであれば、「ドキュメントの存在確認」「型の確認」「正確な文字列評価」の3段構えでコードを書くべきだ。

2. 堅牢なコードを書くためのAPIアプローチ

`SldWorks.ModelDoc2` オブジェクトから現在のコンフィギュレーション名を取得するには、`GetCurrentConfiguration` メソッドを使用する。

Dim swConfig As SldWorks.Configuration
Set swConfig = swModel.GetActiveConfiguration()
Dim configName As String
configName = swConfig.Name

もちろん、直接 `swModel.GetCurrentConfiguration()`(String型を返す)を叩いてもいいが、`GetActiveConfiguration` を経由してConfigurationオブジェクトを取得するアプローチの方が、将来的にコンフィギュレーション固有のプロパティ(マテリアル情報やメモなど)にアクセスする拡張性が生まれるため、私はこちらの設計を強く推奨する。

3. 【コピペOK】実務仕様のプロダクションコード

それでは、現場でそのまま使える、エラーハンドリングと安全な分岐処理を網羅した模範的なVBAコードを提示しよう。
このコードは、現在アクティブなコンフィギュレーションが「Default」なのか、それともカスタム品(例: “Custom”)なのかを判定し、処理を綺麗に切り替えるテンプレートだ。

Option Explicit

‘========================================================================
‘ プロジェクト名: ConfiGurationGuard_Sample
‘ 概要 : アクティブなコンフィギュレーションを安全に取得し分岐処理を行う
‘ 備考 : 開発現場でそのまま流用可能な堅牢設計テンプレート
‘========================================================================
Sub Main_ConfigurationBranch()

Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swConfig As SldWorks.Configuration
Dim configName As String

‘ 1. アプリケーションインスタンスの取得
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. ドキュメントタイプのチェック (パーツ(1) または アセンブリ(2) のみ対象とする)
Dim docType As Long
docType = swModel.GetType
If docType <> swDocPART And docType <> swDocASSEMBLY Then
MsgBox “このマクロはパーツまたはアセンブリでのみ実行可能です。”, vbExclamation, “対象外ドキュメント”
Exit Sub
End If

‘ 4. アクティブなコンフィギュレーションの取得(安全なラッパー的アプローチ)
Set swConfig = swModel.GetActiveConfiguration
If swConfig Is Nothing Then
MsgBox “アクティブなコンフィギュレーションの取得に失敗しました。”, vbCritical, “APIエラー”
Exit Sub
End If

configName = swConfig.Name

‘ デバッグ用:イミディエイトウィンドウに出力
Debug.Print “現在のアクティブコンフィギュレーション: [” & configName & “]”

‘ 5. コンフィギュレーションに応じた堅牢な分岐処理
‘ ※大文字小文字の揺れを防ぐため UCase関数で正規化して比較する
Select Case UCase(Trim(configName))

Case UCase(“Default”)
‘ — 標準コンフィギュレーション向けの処理 —
Call ProcessForDefaultConfiguration(swModel)

Case UCase(“Custom”), UCase(“Special_Order”)
‘ — 特殊・カスタムコンフィギュレーション向けの処理 —
Call ProcessForCustomConfiguration(swModel, configName)

Case Else
‘ — 想定外のコンフィギュレーションだった場合 —
MsgBox “未定義のコンフィギュレーション [” & configName & “] が検出されました。” & vbCrLf & _
“処理を中断します。”, vbExclamation, “処理中断”
Exit Sub

End Select

MsgBox “処理が正常に完了しました。” & vbCrLf & “対象コンフィギュレーション: ” & configName, vbInformation, “完了”

End Sub

‘========================================================================
‘ サブ処理1: Default向けの処理
‘========================================================================
Private Sub ProcessForDefaultConfiguration(ByRef model As SldWorks.ModelDoc2)
‘ ここにDefault時のロジックを記述
Debug.Print “-> Defaultコンフィギュレーション用の処理を実行中…”

‘ 例: 特定のカスタムプロパティを設定するなどの処理
‘ model.AddCustomInfo3 …
End Sub

‘========================================================================
‘ サブ処理2: Custom向けの処理
‘========================================================================
Private Sub ProcessForCustomConfiguration(ByRef model As SldWorks.ModelDoc2, ByVal confName As String)
‘ ここにCustom時のロジックを記述
Debug.Print “-> ” & confName & ” コンフィギュレーション用の処理を実行中…”
End Sub

4. チーフアーキテクトからの実践アドバイス

このコードをあなたのプロジェクトに組み込むにあたり、以下の3点を心に刻んでおいてほしい。

1. 文字列比較の罠(UCaseとTrimの徹底)
現場の設計者が手動でコンフィギュレーション名を作成すると、意図せず末尾に半角スペースが入っていたり(例: `”Default “`)、大文字・小文字が混在したりする。`UCase(Trim(configName))` で正規化してから比較する癖をつけるだけで、問い合わせチケットの数が激減する。

2. 処理のモジュール化
「もしコンフィギュレーションがAなら〜、Bなら〜」というコードを一つのプロシージャにダラダラと長く書くのはアマチュアのやり方だ。上記のサンプルコードのように、分岐先を別のプライベートプロシージャ(`ProcessForDefaultConfiguration` 等)に切り出せ。保守性が劇的に向上する。

3. データベースや外部ファイル連携への布石
実務の自動化では、「特定のコンフィギュレーション名の場合のみ、ExcelやPDM、DBからデータを取得して寸法を書き換える」という要件が必ず出てくる。その際、今回のコードの `Select Case` の部分を、外部CSVやDBのマスターデータと突き合わせる構造に拡張していけば、メンテナンスフリーな最強の自動化エンジンが完成する。

基礎の徹底こそが、最も近道だ。
明日からのコードに、この「守り」と「攻め」を両立した設計を取り入れてみてほしい。健闘を祈る。

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