【入門編】【コンフィギュレーション名の正規表現マッチング】VBScript.RegExpと連携したマルチ構成部品の柔軟なフィルタリング – SolidWorks VBA解析バイブル

スポンサーリンク

こんにちは!SolidWorksの自動化の世界へようこそ。
マクロの記録ボタンを押して生成されるコードを眺める段階はもう卒業しましたね。「もっと柔軟に、もっと頭の良い自動化をしたい!」というあなたのために、今日はとっておきの技術を伝授しましょう。

テーマは「VBScript.RegExpと連携した、コンフィギュレーション名の正規表現マッチング」です。

「正規表現」と聞くだけでアレルギー反応を起こす方もいるかもしれませんが、安心してください。ここをクリアすれば、SolidWorks VBAのスキルは一気にプロの領域へ到達します。マルチ構成の複雑なモデルから、欲しいバリエーションだけをスナイパーのように正確に撃ち抜くスマートなフィルタリング手法を、一緒にマスターしていきましょう!

なぜ「正規表現」によるコンフィギュレーション制御が必要なのか?

SolidWorksでボルトやブラケット、あるいは複雑な筐体アセンブリを設計していると、1つの部品の中に膨大な数のコンフィギュレーション(構成部品)が存在することがありますよね。

例えば、こんな型番規則があったとします。

  • `M8-L25-SUS`(M8、長さ25、ステンレス)
  • `M8-L30-SUS`(M8、長さ30、ステンレス)
  • `M10-L25-SS` (M10、長さ25、一般鋼)
  • `M10-L40-BRASS`(M10、長さ40、真鍮)

もしあなたが「M8またはM10で、かつ材質がSUSのコンフィギュレーションだけをすべてアクティブにして一括処理したい」と思ったとき、標準のVBAの `InStr` 関数や `Like` 演算子だけでこれを書こうとすると、条件分岐の嵐になり、コードがスパゲッティのように複雑化してしまいます。

ここで登場するのが VBScriptの正規表現エンジン(`VBScript.RegExp`) です。これを使えば、「M[8|10].SUS」といったパターンの文字列を記述するだけで、一瞬で条件に一致するコンフィギュレーションを抽出できるようになります。

実装の全体像とアーキテクチャ

SolidWorks VBAから正規表現を使うためのアプローチは非常にシンプルです。

1. ActiveDocの取得: 現在開いている `ModelDoc2` を取得する。
2. コンフィギュレーション名の取得: `GetConfigurationNames` メソッドで全コンフィギュレーション名の配列を取得する。
3. RegExpオブジェクトの生成: `CreateObject(“VBScript.RegExp”)` で正規表現エンジンをメモリ上に召喚する。
4. パターンのコンパイルとマッチング: 取得した配列をループさせ、一つひとつのコンフィギュレーション名がパターンに合致するか判定する。
5. バッチ処理の実行: マッチしたものに対して、処理(構成部品の切り替えやプロパティ変更など)を行う。

では、実際のコードを見てみましょう。

実践!コンフィギュレーション正規表現フィルタリング マクロ

以下のコードをSolidWorksのVBAエディタ(VBE)に貼り付けて実行してみてください。

Option Explicit

‘ =========================================================================
‘ プロジェクト名: ConfigRegexFilter
‘ 概要: VBScript.RegExpを使用して、特定パターンのコンフィギュレーションを
‘ 柔軟に抽出し、順次アクティブにして処理する実用サンプル
‘ =========================================================================
Sub Main()
‘ 1. アプリケーションとアクティブドキュメントの取得
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2

Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc

‘ ドキュメントが開かれていない、またはアセンブリ・部品以外の場合は終了
If swModel Is Nothing Then
MsgBox “アクティブなドキュメントがありません。”, vbCritical, “エラー”
Exit Sub
End If

Dim docType As Long
docType = swModel.GetType
If docType <> swDocPART And docType <> swDocASSEMBLY Then
MsgBox “部品またはアセンブリドキュメントを開いて実行してください。”, vbExclamation, “警告”
Exit Sub
End If

‘ 2. コンフィギュレーション名の全取得
Dim vConfigNames As Variant
vConfigNames = swModel.GetConfigurationNames

If IsEmpty(vConfigNames) Then
MsgBox “コンフィギュレーションが存在しません。”, vbExclamation, “警告”
Exit Sub
End If

‘ 3. VBScript.RegExp オブジェクトの生成
Dim regEx As Object
Set regEx = CreateObject(“VBScript.RegExp”)

With regEx
‘ 【正規表現パターンの設定】
‘ 例: “M8” または “M10” で始まり、途中に任意の文字を挟んで、最後に “SUS” で終わるもの
‘ 意味: ^(M8|M10).SUS$
.Pattern = “^(M8|M10).SUS$”

‘ 大文字・小文字を区別するかどうか (False = 区別する, True = 区別しない)
.IgnoreCase = True

‘ 複数行マッチングを有効にするか
.Global = True
End With

‘ 4. フィルタリングと一括処理のループ
Dim i As Long
Dim configName As String
Dim matchCount As Long
matchCount = 0

‘ 画面描画を停止してパフォーマンスを極限まで高める(チーフのこだわり)
swModel.Extension.EnableAnimations = False

For i = LBound(vConfigNames) To UBound(vConfigNames)
configName = vConfigNames(i)

‘ 正規表現によるパターンマッチング判定
If regEx.Test(configName) Then
matchCount = matchCount + 1

‘ —【ここに目的のバッチ処理を記述】—
‘ 今回は例として、合致したコンフィギュレーションに切り替える処理を行います
Dim status As Boolean
status = swModel.ShowConfiguration2(configName)

If status Then
Debug.Print “処理成功: ” & configName
‘ TODO: ここにカスタムプロパティの書き込みや、エクスポート処理などを記述
Else
Debug.Print “切替失敗: ” & configName
End If
—————————————–

End If
Next i

‘ 画面描画の復元
swModel.Extension.EnableAnimations = True

‘ 5. 結果報告
MsgBox “処理が完了しました。” & vbCrLf & _
“一致したコンフィギュレーション数: ” & matchCount & “件”, vbInformation, “完了”

End Sub

コードの深掘り解説:ここがエンジニアの腕の見せ所

1. `CreateObject(“VBScript.RegExp”)` のスマートさ

VBAには標準で強力な正規表現エンジンが備わっていません。しかし、Windows環境であればOS標準のVBScriptコンポーネントである `VBScript.RegExp` を遅延バインディング(`As Object`)で呼び出すことで、追加の参照設定なしで、最先端の正規表現パワーを手に入れることができます。
コードが軽快で、配布する際にも「参照設定の外れグセ」に悩まされないのが、実務における最大の強みです。

2. 正規表現パターンの魔術(`^` と `$` と `.`)

今回のサンプルで使用したパターン `^(M8|M10).SUS$` を分解してみましょう。

  • `^` : 文字列の先頭に一致
  • `(M8|M10)` : 「M8」または「M10」のいずれか
  • `.` : 任意の文字が0文字以上続く(間に何が入っても良い)
  • `SUS` : 「SUS」という文字列
  • `$` : 文字列の末尾に一致

これにより、「M8-L25-SUS」や「M10_TypeA_SUS」などは見事にヒットしますが、「SUS-M8」や「M12-L25-SUS」などは華麗にスルーされます。この柔軟性こそが、固定文字列検索との決定的な違いです。

3. パフォーマンスへの配慮:`EnableAnimations = False`

大量のコンフィギュレーションをプログラム側で切り替える (`ShowConfiguration2`) と、SolidWorksは律儀にグラフィックビューを再描画しようとします。これがマクロを激遅にする最大の原因です。
ループの直前で `swModel.Extension.EnableAnimations = False` を挟み、処理が終わったら `True` に戻す。この一手間を知っているかどうかが、プロのエンジニアとアマチュアを分ける境界線です。

陥りやすい罠とエラー回避の知見

1. メモリリークの防止
`Set regEx = Nothing` は、プロシージャ(Sub)が終了すればVBAが自動的にガベージコレクションを行ってくれますが、巨大なアセンブリをループ処理するような重いマクロを書く場合は、ループの脱出時や処理の節目で明示的にオブジェクトを破棄する癖をつけておくと安全です。
2. コンフィギュレーション名の大文字・小文字
SolidWorksのコンフィギュレーション名は、デフォルトで大文字・小文字を厳密に区別しませんが、厳密にフィルタリングしたい場合は `.IgnoreCase = False` に変更してください。

まとめ

いかがでしたでしょうか?
今回は、SolidWorks VBAの基本オブジェクト操作と、外部の強力なVBScript正規表現エンジンをスマートに融合させるテクニックを解説しました。

「コンフィギュレーション名が複雑すぎて、マクロで一括制御しきれない……」と諦めていた現場でも、この正規表現フィルタリングを導入すれば、どんなにカオスな命名規則のモデルであっても一撃で美しく調教することができます。

ここをクリアできれば、あなたのSolidWorks VBAスキルはもう初級者ではありません。
ぜひ、明日の業務自動化にこの知見を取り入れて、周囲をアッと言わせるようなスマートなツールを作ってみてください。それでは、また次の極限の世界でお会いしましょう!

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