VBAで正規表現を用いてテキスト処理をします。
VBAはVisual Basic for ApplicationのことでMicrosoftのOffice系アプリケーションを自動化できるプログラミング言語です。
非SEの方にとっては最も馴染み深いプログラミング言語だと思います。
正規表現とは文字列の集合を一定の規則で表現するものです。
プログラミングに限らず文字列を扱う際には扱えると非常に便利です。
正規表現を用いるタイミング
下記のようなファイル名のリストがあるとします。
test-0000023.txt
test-0000024.txt
test-0000025.txt...
‘test’がprefixで数字部分が連番とします。
正直テキストとして’text-00000’とか’.txt’とかを文字列として持ってても見づらく邪魔ですよね。
連番部分のみにしたいとき皆さんはどうしているでしょうか。
手動でやるときはテキストエディタの正規表現での置換機能で取り除いてますが、今回はテーマを設定しておりますのでVBAのプログラム内で正規表現を用いて実施します。
VBAで正規表現を用いてテキスト処理をする
test-0000023.txt
今回はこちらの文字列から’23’だけを抜き取ります。
結果から記載すると下記のように書くことでできます。
'変数
Dim testTxt as String
testTxt = "test-0000023.txt"
'正規表現オブジェクト変数の宣言
Dim re As New RegExp
'正規表現を用いてテキスト処理
With re
.Pattern = "^test-[0]*([¥d]+)¥.txt$"
if .test(testTxt) then
.replace(testTxt,"$1")
end if
End With
詳細に説明していきますが、最初の変数のところは今回は分かるものとして飛ばします。
正規表現オブジェクトの作成
次の箇所は正規表現オブジェクト変数を作成しています。
'正規表現オブジェクト変数の宣言
Dim re As New RegExp
正規表現オブジェクトタイプはRegExpで、reという任意の変数の型をRegExpにしています。
分かりづらい場合は、reという変数で正規表現のテキスト処理をできるようにしたことだけ理解してもらえればよいです。
正規表現を用いてテキスト処理をする
先ほど作成した正規表現オブジェクトでテキスト処理をしていきます。
Withステートメント
With re
End With
まず先ほど作成した正規表現オブジェクトのWithステートメントを記載します。
Withステートメントでオブジェクト名の繰り返し記載しなければならないのを省略できます。
あとに出てくる.Pattern、.Test、.Replaceは正規表現オブジェクトのメソッドなので本来はre.Pattern、re.Test、re.Replaceのように記載する必要がありますが、Withステートメントを利用することでreを省略できコードを見やすくすることができます。
.Patternプロパティ
次に出てくる.Patternではマッチさせたい正規表現パターンを記述します。
.Pattern = "^test-[0]*([¥d]+)¥.txt$"
正規表現パターンの書き方はプログラミング言語次第で若干異なることがありますが、概ね同じです。
VBA特有の書き方は、ダブルスラッシュがエスケープしなければならないことくらいと思います。
コードで記載したパターンを説明すると、^が文字列の先頭を表します。
^test-でtest-で始まる文字列を表しています。
次の[0]*は0個以上の0の連続を意味します。
[]はつけていますがこの場合はつけなくても良いです。
*は直前の文字の0個以上の連続を意味します。
0個でも構いません。
[¥d]+は1個以上の数字の連続です。
[]は先ほど同様つけなくてもよいです。
¥dは0-9は数字を意味します。
+は直前の文字の1個以上の連続を表します。
¥.txt$で文字列が.txtで終わることを意味します。
.の前の¥は.がただの文字として扱われるようにエスケープするためのものです。
$が文字列の最後を意味します。
つまり、テストプログラムのパターンはtest-から始まり、0始まりを含む数桁の文字列が続き、.testで終わる文字列を意味します。
.testプロパティ
if .test(testTxt) then
...
end if
if文の条件に.testプロパティを使用しています。
.testプロパティは引数の文字列にpatternプロパティにセットした正規表現パターンに一致するものがあるかチェックします。
あればtrue、なければfalseを返します。
つまりif文と合わせてあれば処理実行、なければ処理スルーとしています。
テストプログラムで言うとtestTxtが引数です。
.replaceプロパティ
.replace(testTxt,"$1")
.replaceで.patternに設定した正規表現パターンを使って文字列置換ができます。
引数1が対象文字列、引数2が置換後の値です。
今回の例で言うとtestTxtが引数1で$1が引数2です。
testTxtの文字列からpatternプロパティに設定した正規表現パターンで一致した文字列を$1に置き換えようとしています。
正規表現で$1は正規表現パターン内の1つ目の文字セットを意味します。
正規表現内で()を使って括った部分は文字セットとして認識されます。
今回で言うと([¥d]+)の部分が$1です。
置換後の値に$1を指定しているため、testTxtの文字列を([¥d]+)に置き換えようとしているということです。
実行すると([¥d]+)に該当する23が残ります。
正規表現を使うと文字列処理が簡単になる
最初の方にも書きましたが文字列の処理をする際に正規表現は非常に便利です。
VBAだけでなくプログラミング言語なら基本的に利用できますし、すこし高度なテキストエディタなら必ず使えます。
確実に扱えるようにしましょう。
