エクセルVBAの置換に正規表現を使う

エクセルVBA正規表現が使えることを知ったのでメモ。

前準備

まずはVBAエディタを開き(Excelを開いた状態で Alt+F11)、VBAScriptの設定をします。

ツール(T) → 参照設定(R) → Microsoft VBScript Regular Expressions 5.5 にチェック → OK

これでVBAから正規表現の機能が使えるようになります。

f:id:xterm256color:20150617213632p:plain

置換例①

まずは基本的な使い方から。

RegExpオブジェクト re のPatternプロパティに、置換したいパターンをセットしておきます。

その後にReplaceメソッドを呼び出すことで文字列を置換することができます。 Replaceメソッドの第一引数が置換対象の文字列(abcd567hijk)。第二引数がパターン(efg)を置き換える文字列です。

re.Replace(置換対象の文字列, 置換文字列)

下記の例では、Replaceメソッドにより"abcd567hijk"の数字部分(正規表現では[0-9]+と表す)が"efg"に置き換えられ、"abcdefghijk"という文字列を返します。

Option Explicit

Sub main()
    Dim re
    Set re = CreateObject("VBScript.RegExp")
    
    ' 正規表現パターンをセット
    re.pattern = "[0-9]+"
    
    ' 第一引数が置換対象の文字列、第二引数が置換文字列
    Debug.Print re.Replace("abcd567hijk", "efg")
    
End Sub

置換例②

パターンの部分文字列を使った置換。引っかかってしまったのでメモ。

置換の正規表現パターンに括弧を含めていると、置換後の文字列に括弧内にマッチした部分文字列を使うことが出来ます。

下の例では、置換対象の文字列"2015/6/17 22:25"の年、月、日を部分文字列として、置換後の文字列でも使っています。 一つ目の括弧内にマッチした部分文字列は$1、2つ目の括弧内の部分文字列は$2…という形で参照できます。

つまり、下記の例は"2015年6月17日 22:25"という結果になります。

Option Explicit

Sub main()
    Dim re
    Set re = CreateObject("VBScript.RegExp")
    
    ' 正規表現パターンをセット
    re.pattern = "([0-9]+)/([0-9]+)/([0-9]+)"
    
    ' 第一引数が置換対象の文字列、第二引数が置換後の文字列
    Debug.Print re.Replace("2015/6/17 22:25", "$1年$2月$3日")
    
End Sub

今まで使ったsedコマンド等では、部分文字列を使う場合に\1とかだったので、引っかかってしまいました。。