正規表現のようなマッチング


VBAの標準機能では、正規表現によるマッチングができません。しかし、正規表現に似た働きをする演算子があります。それはLike演算子です。

なお「"のような"では困る。正規表現を使いたいんだ!」という方は「正規表現によるマッチング」をご覧ください。

Likeは演算子ですから、その他の比較演算子「=」や「<>」などと同じように使います。

Like演算子で使用できる記号は次の通りです。

記号 意味 使用例 マッチする文字列
? 任意の1文字 たな? たなか、たなべ、たなし(など)
* 0個以上の任意の文字 たか* たかだ、たかなか、たかやなぎ(など)
# 1文字の数値(0~9) ## 01、26、95(など)
[charlist] charlistに指定した文字の中の1文字 [A-F] A、B、C、D、E、F
[!charlist] charlistに指定した文字の中に含まれない1文字 [!A-F] G 、H、I(など)

一般的な正規表現に比べると使用できるメタキャラクタの種類は少ないですが、いくつも条件分岐を重ねるよりは効率的にパターンマッチングできるでしょう。いくつか使用例をご紹介します。

上のような住所録で「東京、横浜、千葉ではない住所を赤字」にするには、次のようにします。

Sub Sample1()
    Dim i As Long
    For i = 1 To 8
        If Cells(i, 1).Value Like "[!東京,横浜,千葉]*" Then Cells(i, 1).Font.ColorIndex = 3
    Next i
End Sub

Like演算子を使わないなら、次のようになりますね。

Sub Sample2()
    Dim i As Long
    For i = 1 To 8
        If Left(Cells(i, 1), 2) <> "東京" And _
           Left(Cells(i, 1), 2) <> "横浜" And _
           Left(Cells(i, 1), 2) <> "千葉" Then Cells(i, 1).Font.ColorIndex = 3
    Next i
End Sub

もう1つ。下のように日付が入力されているとします。

次のコードは、1月から6月までの日付だったらB列に○を挿入します。

Sub Sample3()
    Dim i As Long
    For i = 1 To 8
        If Month(Cells(i, 1)) Like "[1-6]" Then Cells(i, 2) = "○"
    Next i
End Sub

Like演算子を使わないのでしたら、次のようにSelect Caseステートメントでしょうか。

Sub Sample4()
    Dim i As Long
    For i = 1 To 8
        Select Case Month(Cells(i, 1))
        Case 1 To 6
            Cells(i, 2) = "○"
        End Select
    Next i
End Sub

最後に。下のように名前が入力されていたとします。この中から、タ行の名前だけをSheet2にコピーしてみましょう。

Sub Sample5()
    Dim i As Long, j As Long
    For i = 1 To 8
        If Cells(i, 1).Phonetic.Text Like "[タ-ト]*" Then
            j = j + 1
            Cells(i, 1).Copy Sheets("Sheet2").Cells(j, 1)
        End If
    Next i
End Sub

あ、もちろん、セルのふりがな情報が正しく登録されてなくちゃダメですよ。他のソフトから文字列を貼り付けたら、ふりがなは設定されませんからね。もし、ふりがなを全角のカタカナ以外に設定していたら、StrConv関数などで変換してやりましょう。応用すれば、たくさんの名簿を五十音ごとのシートに割り振ることもできますね。

補足:

本稿はかなり昔に書きました。画像から推測すると、おそらく20年以上前かと。その後、間違いに気づきましたけど、面倒くさいので放置していましたw ただ最近、某VBA認定試験のテキストを改定していて、このLike演算子についても解説を書きました。「こういう使い方はできませんよ」と書いたとき、ああ、そういえばWebの方も間違えたままだったな~と思い出したので、ここに追記しておきます。

"[!東京,横浜,千葉]*"という書き方は正しくないです。[]内のcharlistは1文字しか指定できませんので、"[!東京,横浜,千葉]*"だと「東ではない」「横ではない」「千ではない」という意味になってしまいます。もっと正確には「,」も文字として扱われますので「,ではない」も含まれちゃいます。まあ、やってみれば分かります。今さら、本文のそこだけを直すのもどうかと思いますので、ここに補足として書いておきます。