先日ネットショップの商品データを管理しているExcelファイルで、数百行のデータに対しVBAの正規表現で一括変更を行ったのだが、その時につまづいたので備忘録としてまとめておく。
今回つまづいたのは、複数行のテキストを一つのセルに入力している「商品説明」欄の一括更新だ。
VBAで正規表現を使って一括更新をかけようとしたのだが「改行を含む複数行の文字列」のマッチングのやり方が分からなかった。
失敗例
まず最初に試したのがこちら。
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 | 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」を使うと良いそうだ。
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 | 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 |
上記のコードを実行したところ、パターンで指定した「製品仕様」以降の文字列を、改行含めすべて取得することができた。