VBAで正規表現を使う

込み入った検索では正規表現が便利ですが、VBAで使ったことなかったので、使い方を調べ、メモとして残しておきます。

作ったコードはこんな感じ。

Sub RegExpSample()
    '参照設定 Microsoft VBScript Regular Expressions 5.5    
    Dim myRegExp As RegExp
    Dim myPtn As String
    Dim myRange As Range
    
    Set myRegExp = New RegExp
    myPtn = "[0-9]"
    
    With myRegExp
        .Pattern = myPtn        '検索パターン
        .IgnoreCase = True     '大文字と小文字を区別しない
        .Global = True             '全体を検索
        For Each myRange In ActiveSheet.UsedRange
            If .Test(myRange.Formula) = True Then
                myRange.Interior.ColorIndex = 8
            End If
        Next
    End With

コードを書く前に、Microsoft VBScript Regular Expressions 5.5の参照設定を行います。
複雑なVBAのコードを書く場合は、仕事に役立つ ExcelVBA実用サンプルコレクション 新装版 Excel徹底活用シリーズを参考にしていますが、ここの書き方ではうまくいかず。オブジェクトの設定等は、ネットで調べました。myRegExpは正規表現のオブジェクト、myPtnは正規表現で書かれたマッチングパターン、myRnageはループ用のRangeオブジェクト。

    Dim myRegExp As RegExp
    Dim myPtn As String
    Dim myRange As Range

正規表現オブジェクトをセット。正規表現文字列は今回、[0-9]としています。

    Set myRegExp = New RegExp
    myPtn = "[0-9]"

検索前のおまじない。myRegExpにパターンを設定し、検索設定も併せて設定。

    With myRegExp
        .Pattern = myPtn 
        .IgnoreCase = True 
        .Global = True 

いよいよ検索。今回は特定のRange範囲を設定し、マッチしたセルは背景色を変えています。Range全体を一気に検索はできないので、For Eachでループしています。

       For Each myRange In ActiveSheet.UsedRange
            If .Test(myRange.Formula) = True Then
                myRange.Interior.ColorIndex = 8
            End If
        Next

これで一応検索可能。