Excel VBAで正規表現オブジェクトを使ってみる(VBScriptのRegExpオブジェクトを呼び出す)

お試しで書いてみたもの。計算結果のセルを目立たせるため、sum関数のあるセルの背景色を一括変更しようと作ったものです。

Excel VBA単体では正規表現が使えないため(Like演算子で代替可能なこともある*1 )、VBScirptのエンジンを呼び出して、VBRegExpオブジェクトを使用します。

  • CreateObjectを使う方法とエディタで参照設定して使う方法がありますが、今回は後者を使用しています。
    • 参照設定は実行環境(Excelやライブラリのバージョン)による互換性問題がありますが、大勢・複数のPCで使用する予定がなければあまり問題は起きない…はずです。
    • Objectオブジェクト*2を乱立するのは避けたかったため。Regexp以外のオブジェクトが増えたときに取り間違いを起こしやすい、気がします。
  • メソッドは、RegExp.testとRegExp.execute、RegExp.Replaceの3種類。
    • testは一致不一致をbooleanで返します。
    • executeを使うと結果がMatchesコレクションで返され、一致回数や後方参照など詳細解析ができます。
    • Replaceは文字列置換。

参考

Sub regexpの実験()
'RegExpオブジェクトとMatchesコレクション(Matchオブジェクト)の使い方テスト  
    
    Dim test_regex As RegExp
    Dim r As Range
    
    Set test_regex = new RegExp  
    
    'sum関数のあるセルの背景色を変える
    With test_regex
        .Pattern = "SUM\(" '正規表現のパターン。記号のエスケープ注意(特に2重引用符)
        .IgnoreCase = True '大文字小文字を区別しないときはTrue。デフォルトfalse。
        .Global = True     '/g の設定。デフォルトFalse
        For Each r In ActiveSheet.UsedRange
            If .test(r.Formula) Then r.Interior.ColorIndex = 3
        Next r
    End With
    Set test_regex = Nothing 'オブジェクト開放?      

End Sub

*1:ただ、Like演算子正規表現では細かいところで違い、両方使うと混乱する

*2:日本語として微妙