【VBA入門】Like演算子(ワイルドカード、エスケープ、否定)

あなたはLike演算子を使っていますか? 正規表現が使えない場合に、Like演算子で代替することができて便利です。

この記事では、Like演算子について基本的な使い方から、

  • ワイルドカードのエスケープ
  • Likeの否定(Not)
  • 複数条件を指定するには
  • 大文字小文字の区別なしで使用するには


など応用的な内容まで、Like演算子について使い方をわかりやすく解説します!

目次

Like演算子とは

Like演算子は2つの文字列を比較するために使用します。Like演算子は以下のように記述して使います。

result = string Like pattern

 

stringとpatternはString型の文字列です。stringがpatternに一致する場合resultはTrueになり、一致しない場合resultはFalseになります。

stringまたはpatternのどちらかがNullの場合、resultはNullになります。patternにはパターンマッチング規則に準拠する文字列を指定することができます。

ワイルドカード文字や文字のリスト、文字の範囲を組み合わせて正規表現に近いパターンマッチングを行うことができます。

Like演算子の使い方

Like演算子はresultにTrueもしくはFalseを格納するので、Ifステートメントと合わせてよく使われます。以下のような記述になります。

If string Like pattern Then
    処理
End If

サンプルコードで確認しましょう。

Sub macro1()
    Dim arr() As String, str As String, pattern As String, msg As String
    str = "侍エンジニア"
    pattern = "[エンジニア]"
    
    '配列に文字列を1文字ずつ格納
    Dim i As Integer
    ReDim arr(1 To Len(str))
    For i = 1 To UBound(arr)
        arr(i) = Mid(str, i, 1)
    Next i
    
    For Each ele In arr
        If ele Like pattern Then
            msg = msg & ele & ", "
        End If
    Next ele
    
    MsgBox msg
End Sub

実行結果:
Like01

このサンプルコードでは、まずFor Eachステートメントを使って配列arrの要素1つずつを抽出しています。それぞれの要素をLike演算子を使ってString型変数patternと一致するかマッチングを行い、マッチした場合はその要素を表示しています。

ちなみに変数pattern内で使われいる”[ ]”はワイルドカードで使用される文字で、ワイルドカードとそれに使われる文字については後ほど解説します。

ワイルドカードとは

ワイルドカードとは、あるパターンにマッチするように表現した文字列のことです。不特定の文字列があるパターンにマッチするか一括で判定する場合などに使われます。

ワイルドカードで使われる文字について表にまとめした。

文字説明
?任意の1文字
*0文字以上の文字
#0~9の半角数字
[charlist]charlistに含まれる全角または半角の1文字
[!charlist]charlistに含まれない全角または半角の1文字

ワイルドカードで使える文字は、正規表現で使える文字に比べて少ないので、正規表現に比べて表現できるパターンには制限があります。

それではサンプルコードで確認してみましょう。文字”!”を使ってcharlistに含まれない文字を出力表示します。

Sub macro2()
    Dim arr() As String, str As String, pattern As String, msg As String
    str = "侍エンジニア"
    pattern = "[!エンジニア]"
    
    '配列に文字列を1文字ずつ格納
    Dim i As Integer
    ReDim arr(1 To Len(str))
    For i = 1 To UBound(arr)
        arr(i) = Mid(str, i, 1)
    Next i
    
    For Each ele In arr
        If ele Like pattern Then
            msg = msg & ele & ", "
        End If
    Next ele
    
    MsgBox msg
End Sub

実行結果:
Like02

このサンプルコードでは、先ほどのサンプルコードの変数patternの値を”[!エンジニア]”としています。したがって、配列arrの要素から”エンジニア”のいずれの文字とも一致しない文字が出力表示されています。

ワイルドカードのエスケープ

ワイルドカードとそれに使用する文字について解説しました。ワイルドカードで使われている文字、例えば”?”や”!”などをLike演算子のpatternの中に使いたい場合、どうしたらよいのでしょうか?

“?”や”!”などのワイルドカードで使われる文字をLike演算子のpattern中で使えるように記述することをワイルドカードのエスケープと呼びます。ワイルドカードで使われる文字は”[ ]”で囲むことでエスケープすることができます。

サンプルコードで確認しましょう。

Sub macro3()
    Dim arr() As String, str As String, pattern As String
    str = "侍エンジニア!"
    pattern = "*[!]*"
    
    If str Like pattern Then
        MsgBox "! が見つかりました"
    End If    
End Sub

実行結果:
Like03

このサンプルコードでは、Like演算子を使ってString型変数patternと一致するかマッチングを行っています。変数patternにはワイルドカードで使用する文字”!”を”[ ]”で囲って使用しています。

変数strには文字”!”が含まれますので、結果が出力表示されています。

Likeの否定(Not)

IfステートメントでLikeを否定する記述は下記のとおりになります。

If Not string Like pattern Then
    処理
End If

サンプルコードで確認しましょう。

Sub macro4()
    Dim arr() As String, str As String, pattern As String, msg As String
    str = "侍エンジニア"
    pattern = "[エンジニア]"
    
    '配列に文字列を1文字ずつ格納
    Dim i As Integer
    ReDim arr(1 To Len(str))
    For i = 1 To UBound(arr)
        arr(i) = Mid(str, i, 1)
    Next i
    
    For Each ele In arr
        If Not ele Like pattern Then
            msg = msg & ele & ", "
        End If
    Next ele
    
    MsgBox msg
End Sub

実行結果:
Like02

複数条件を指定するには

複数条件を指定するには論理演算子「And」や「Or」を使用します。サンプルコードで確認しましょう。

Sub macro5()
    Dim arr() As String, str As String, pattern1 As String, pattern2 As String
    str = "侍エンジニア!"
    pattern1 = "*[侍]*"
    pattern2 = "*[塾]*"
    
    Dim bool As Boolean
    bool = str Like pattern1 And str Like pattern2
    If bool Then
        MsgBox "侍 も 塾 も見つかりました"
    End If
End Sub

実行結果:
Like04

大文字小文字の区別なしで使用するには

Like演算子は大文字小文字を区別してパターンマッチングの判定を行います。これに対し、大文字小文字の区別なしでLike演算子の判定を行うには2つの方法があります。

1つ目は、Option Compare Textで指定する方法です。2つ目は、比較する2つの文字列を「どちらも大文字」もしくは「どちらも小文字」に変換してから比較する方法です。

それぞれくわしくみていきましょう。

Option Compare Textで指定する方法

Option CompareステートメントをTextで指定すると、文字列比較は大文字と小文字を区別しなくなります。サンプルコードで確認しましょう。

Option Compare Text

Sub macro6()
    Dim arr() As String, str As String, pattern As String
    str = "Hello VBA!"
    pattern = "*[vba]*"
    
    If str Like pattern Then
        MsgBox "vba が見つかりました"
    End If
    
End Sub

実行結果:
Like05

大文字もしくは小文字に変換する方法

文字列を大文字に変換するにはUCase関数を、小文字に変換するにはLCase関数を使用します。比較する文字列をどちらも大文字に変換してLike演算子で判定してみましょう。

Sub macro7()
    Dim arr() As String, str As String, pattern As String
    str = "Hello VBA!"
    pattern = "*[vba]*"
    
    If UCase(str) Like UCase(pattern) Then
        MsgBox "vba が見つかりました"
    End If
    
End Sub

実行結果:
Like05

文字列の操作総まとめ

この記事では紹介しきれなかった文字列の様々操作についてはこちらの記事で解説しているので、ぜひ確認してみてください!

まとめ

ここでは、Like演算子の使い方について説明しました。Like演算子はワイルドカードを使ってパターンマッチングができます。

正規表現が使えない場合などは、Like演算子とワイルドカードで代替することができて便利です。使いこなすことができるように、この記事を何度も参考にして下さいね!

この記事を書いた人

熊本在住のフリープログラマ兼ライターです。C/C++/C#、Java、Python、HTML/CSS、PHPを使ってプログラミングをしています。専門は画像処理で最近は機械学習、ディープラーニングにはまっています。幅広くやってきた経験を活かしてポイントをわかりやすくお伝えしようと思います。
お問合せはこちらでも受け付けています。
info@sss-lab.com

目次