先日ネットショップの商品データを管理しているExcelファイルで、数百行のデータに対しVBAの正規表現で一括変更を行ったのだが、その時につまづいたので備忘録としてまとめておく。
今回つまづいたのは、複数行のテキストを一つのセルに入力している「商品説明」欄の一括更新だ。
VBAで正規表現を使って一括更新をかけようとしたのだが「改行を含む複数行の文字列」のマッチングのやり方が分からなかった。
失敗例
まず最初に試したのがこちら。
Sub regMatching()
    Dim reg As Object
    
    Set reg = CreateObject("VBScript.RegExp")
    
    With reg
        ' 「製品仕様」以降の文字列を改行含めすべて取得
        .Pattern = "製品仕様.*"
        .Global = True
    End With
    
    Dim matches As Variant
    Set matches = reg.Execute(Cells(1, 1))
    Dim match As Variant
    For Each match In matches
        MsgBox match.Value
    Next match
End Sub
このパターン指定(製品仕様.*)が真っ先に思いついたのだが、改行された後の文字列を取得できなかった。
ドットではなく「\s\S」を使用する
調べてみると、ドットでは改行にマッチさせることができないので、エスケープシーケンス「\s\S」を使うと良いそうだ。
Sub regMatching()
    Dim reg As Object
    
    Set reg = CreateObject("VBScript.RegExp")
    
    With reg
        ' 「製品仕様」以降の文字列を改行含めすべて取得
        .Pattern = "製品仕様[\s\S]*"
        .Global = True
    End With
    
    Dim matches As Variant
    Set matches = reg.Execute(Cells(1, 1))
    Dim match As Variant
    For Each match In matches
        MsgBox match.Value
    Next match
End Sub
上記のコードを実行したところ、パターンで指定した「製品仕様」以降の文字列を、改行含めすべて取得することができた。