【コンフィギュレーション名の正規表現マッチング】VBScript.RegExpと連携したマルチ構成部品の柔軟なフィルタリング
SolidWorksマクロの限界領域に挑むエンジニア諸君。日々の設計業務において、数多のコンフィギュレーションを持つファミリ部品や、複雑な型番規則(PN規則)で管理されたアセンブリの制御に頭を悩ませてはいないか?
「前方一致や部分一致の `InStr` 関数、あるいはワイルドカードでは、複雑化する社内ニッチな命名規則に対応しきれない」
「特定の正規表現パターンに合致するコンフィギュレーションだけを高速に抽出し、一括してプロパティ書き換えやエクスポートを行いたい」
本稿では、VBA単体では到底太刀打ちできない高度な文字列操作を、Windows環境に標準搭載された `VBScript.RegExp` エンジンと融合させ、SolidWorksの `ModelDoc2` / `Configuration` オブジェクト群を極限まで効率的に制御する手法を解説する。
—
1. なぜVBAで「正規表現」なのか? ―― レガシーの殻を破るアーキテクチャ
SolidWorks VBA(SldWorks API)は強力だが、その文字列処理能力は貧弱の極みだ。標準の `Like` 演算子は貧弱なワイルドカードしか使えず、複雑なOR条件や否定先読み、数値範囲の動的マッチングなどを実装しようとすれば、無駄に冗長な条件分岐の迷宮に迷い込むことになる。
ここで、Windows Script Host (WSH) の遺産でありながら今なお健在な `VBScript.RegExp` オブジェクトをVBAからレイトバインド(あるいはアーリーバインド)で呼び出す。これにより、VB6/VBAのランタイムの制約を完全にバイパスし、本格的なPCRE(Perl Compatible Regular Expressions)に近い強力なパターンマッチングをSolidWorksのマクロ空間に持ち込むことが可能となる。
シニアエンジニアが知るべきアーキテクチャ上の注意点
- COMオブジェクトの生成コスト: ループの内部で `CreateObject(“VBScript.RegExp”)` を毎回呼び出す愚を犯してはならない。インスタンスは処理の冒頭で1度だけ生成し、パターン(`Pattern`)を動的に書き換えるか、あるいはマッチングメソッドだけを高速に使い回すこと。
- メモリの明示的解放: VBAのガベージコレクションは気まぐれだ。特にCOMラッパーオブジェクトは、スコープを抜ける瞬間に確実に `Set regEx = Nothing` を明示し、SolidWorksのプロセス空間へのメモリリークを根絶せよ。
—
2. 実装コード:コンフィギュレーション名正規表現フィルター
以下のコードは、アクティブなドキュメントから指定した正規表現パターンに完全合致するコンフィギュレーション名のみを抽出し、その構成要素に対して何らかのバッチ処理(ここではアクティブ化とログ出力)を行うための実用的なプロシージャである。
Option Explicit
‘ ==============================================================================
‘ 概要: VBScript.RegExpを用いたSolidWorksコンフィギュレーション名の高度フィルタリング
‘ ターゲット: SldWorks 2022 / 2023 / 2024 (VBA 7.1対応)
‘ ==============================================================================
Public Sub FilterConfigurationsByRegex()
‘ 1. SolidWorksアプリケーションおよびアクティブモデルの取得
Dim swApp As SldWorks.SldWorks
Set swApp = Application.SldWorks
Dim swModel As SldWorks.ModelDoc2
Set swModel = swApp.ActiveDoc
If swModel Is Nothing Then
MsgBox “アクティブなドキュメントが存在しません。”, vbCritical, “API Error”
Exit Sub
End If
‘ 図面ドキュメント等の例外処理(必要に応じてアセンブリ・部品に限定)
If swModel.GetType = swDocDRAWING Then
MsgBox “このマクロは部品またはアセンブリドキュメントでのみ実行可能です。”, vbExclamation, “Validation Error”
Exit Sub
End If
‘ 2. VBScript.RegExp オブジェクトの初期化(ループ外で1度だけ生成)
Dim regEx As Object
Set regEx = CreateObject(“VBScript.RegExp”)
With regEx
‘ 【例】プレフィックスが “ASSY-” で始まり、その後に4桁の数字、
‘ 末尾が “-REV[A-Z]” で終わるパターンをターゲットにする
.Pattern = “^ASSY-\d{4}-REV[A-Z]$”
.IgnoreCase = True ‘ 大文字・小文字を区別しない
.Global = True ‘ 文字列全体を走査
End With
‘ 3. コンフィギュレーション名の配列を取得
Dim configNames As Variant
configNames = swModel.GetConfigurationNames()
If IsEmpty(configNames) Then
MsgBox “コンフィギュレーションが存在しません。”, vbExclamation, “Data Error”
GoTo Cleanup
End If
‘ 4. フィルタリングとバッチ処理の実行
Dim i As Long
Dim currentConfigName As String
Dim matchCount As Long
matchCount = 0
Debug.Print “=== 正規表現マッチング処理を開始: Pattern = ” & regEx.Pattern & ” ===”
For i = LBound(configNames) To UBound(configNames)
currentConfigName = CStr(configNames(i))
‘ 正規表現による評価
If regEx.Test(currentConfigName) Then
matchCount = matchCount + 1
Debug.Print ” [MATCHED] ” & currentConfigName
‘ — ここに目的のバッチ処理を記述 —
‘ 例: マッチしたコンフィギュレーションを実際にアクティブにする
Dim status As Boolean
status = swModel.ShowConfiguration2(currentConfigName)
If status Then
‘ 例としてカスタムプロパティの操作などをここに挟む
Call ProcessMatchedConfiguration(swModel, currentConfigName)
End If
———————————-
End If
Next i
Debug.Print “=== 処理終了. マッチ数: ” & matchCount & ” / 総数: ” & (UBound(configNames) – LBound(configNames) + 1) & ” ===”
MsgBox “正規表現フィルタリングが完了しました。” & vbCrLf & “一致した構成数: ” & matchCount, vbInformation, “完了”
Cleanup:
‘ 5. メモリの明示的解放(極限環境における必須作法)
Set regEx = Nothing
Set swModel = Nothing
Set swApp = Nothing
End Sub
‘ ==============================================================================
‘ 補助プロシージャ: マッチしたコンフィギュレーションに対する個別処理
‘ ==============================================================================
Private Sub ProcessMatchedConfiguration(ByRef model As SldWorks.ModelDoc2, ByVal configName As String)
‘ 固有のビジネスロジック(例: プロパティの書き込みや軽量化設定など)
‘ ※コンフィギュレーション切り替え直後はモデルの再評価が必要な場合があるため注意
Dim swCustPropMgr As SldWorks.CustomPropertyManager
Set swCustPropMgr = model.Extension.CustomPropertyManager(configName)
‘ 例: ステータスプロパティを “Filtered_OK” に書き換える
swCustPropMgr.Set2 “Regex_Status”, “Filtered_OK”
Set swCustPropMgr = Nothing
End Sub
—
3. チーフアーキテクトが教える、現場で活きる実践的プラクティス
パフォーマンスの罠:モデルの再描画とコンフィギュレーション切替
コード内で `swModel.ShowConfiguration2(currentConfigName)` を呼び出している点に注目してほしい。コンフィギュレーションを切り替えるたびに、SolidWorksはジオメトリの再構築(Rebuild)やコンポーネントのロード・アンロードを裏で実行する。
もし対象となる構成が数十〜数百個に及ぶ場合、この処理だけで数分間のフリーズを引き起こす。
対策:
もし「単にコンフィギュレーション名を文字列として操作し、プロパティやメタデータだけを一括書き換えしたい」のであれば、実際にコンフィギュレーションを画面上で切り替える(`ShowConfiguration2` を呼ぶ)必要はない。
`ModelDocExtension::CustomPropertyManager` の引数に直接コンフィギュレーション名を渡すことで、アクティブ化のコストを完全にバイパスしてバックグラウンド処理が可能となる。APIの無駄なラウンドトリップを削ぎ落とせ。
正規表現パターンの応用例(実務で使えるスニペット)
社内の型番ルールに合わせて、以下のパターンを適宜書き換えて活用してほしい。
1. 特定のプレフィックスとサフィックスを持つもの、かつ中間が任意の数字3桁:
- `Pattern = “^PRT-\d{3}-EX$”`
2. 試作・ホスト品(”TYS” または “PROTOTYPE”)を除外したい場合(否定先負・後読みの代替):
- VBScriptのRegExpはゼロ幅アサーション(先読み・後読み)の一部をサポートしていないため、VBA側で条件を反転させるか、マッチング結果が `False` のものを処理する設計にする。
3. 大文字小文字を厳格に区別した型番マッチング:
- `.IgnoreCase = False` に設定し、型番の厳密なリビジョン管理(例: `-RevA` と `-revA` の厳密な分離)を行う。
—
結びにかえて
VBAと外部COMオブジェクト(VBScript.RegExp)の統合は、レガシーとモダンを繋ぐ最も手軽で強力なアプローチの一つである。
「たかが文字列比較」と侮るなかれ。複雑化するCADデータ管理において、柔軟なパターンマッチングをAPIに組み込む能力こそが、凡百のCADオペレーターと、システムを自在に操る真の自動化エンジニアを分かつ境界線となる。
あなたのSolidWorks環境にこの知見を組み込み、手作業の呪縛から完全に解放されたまえ。
