
VBAで正規表現 導入編
正規表現(Regular Expression)について1回
普段 Excel を使っている人でも正規表現という言葉は馴染みがないかもしれません。
エクセルに備わった検索は、非常に強力ですが、それでも複雑で検索できない文字列や数値があったりします。
正規表現は、特定のパターンに一致する文字列を見つけるための便利なツールです。
たとえば、電話番号やメールアドレスなど、特定の形式に従った文字列を検索したい場合に便利です。
VBA(Visual Basic for Applications)のプログラムでは、VBScript.RegExpオブジェクトが正規表現を使用するために用意されています。(VBAは、ExcelやWordなどのMicrosoft Officeアプリケーションで使用されるプログラミング言語です。)
具体的な例として、次のような電話番号のリストがあるとします。これらの電話番号を正規表現を使って検索する場合、どのようなパターンを設定したら良いでしょうか?

正規表現を使って検索するには、数値を表す、\d
{2,3}直前の文字が何回繰り返すか?
次に来るのは - 、`-` はハイフン(-)を表す。
あとは、このパターンを応用します。
\d{2,3}-\d{4}-\d{4}

\d{2,3}-\d{4}-\d{4}
このパターンが意味する文字列は、
「2〜3桁の数字、ハイフン、4桁の数字、ハイフン、4桁の数字」という形式の文字列という意味になります。
正規表現を使って、上記パターンで検索すると、一致する文字列を簡単に検索できます。

正規表現:数字のみをマッチする表現
● 半角数字
[0-9]
● 半角数字(エスケープシーケンス)
\d
● 全角数字
[0-9]
● 半角か全角のいずれか
[0-90-9]
正規表現:n回以上m回以下の繰り返しにマッチする表現
{n,m}
このパターンを使ってExcelのシート上のデータが、合っているかどうか、記入ミスなどがないかを調べる場合、VBEでコードを記述する必要があります。
それについては、詳しい解説はここでは省きますが、次のようなコードを利用して、判定してみましょう。
Option Explicit
Dim ws As Worksheet,
Sub 固定電話testreg()
Set ws = Worksheets(2)
Dim regex As Object
Set regex = CreateObject("VBScript.RegExp")
regex.Pattern = "\d{2,3}-\d{4}-\d{4}"
regex.Global = False
Dim rng As Range
Dim cell As Range
Set rng = ws.Range("A2:A12")
For Each cell In rng
If Not regex.Test(cell.Value) Then
cell.Offset(0, 1).Value = "False"
Else
cell.Offset(0, 1).Value = "True"
End If
Next cell
End Sub

regex.Pattern = "\d{2,3}-\d{4}-\d{4}"
パターンに合っている場合は、True,合っていない場合はFalseと表示されます。
正規表現が便利そうなことは理解できても、日常的に高度なパターン検索置換をしなければならない状況にないと、使う必要性を感じないかもしれません。 私の場合は、自分が必要と迫られた時、必要な正規表現を考え、後でまた使えるようにメモを残しておきます。