先日ネットショップの商品データを管理している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

上記のコードを実行したところ、パターンで指定した「製品仕様」以降の文字列を、改行含めすべて取得することができた。