目標
VBAのLike演算子について理解し利用できる
演算子には算術演算子・比較演算子・論理演算子・代入演算子・連結演算子があります。この記事ではパターンマッチングを行ってくれるLike演算子について書いています。
Like演算子の概要と利用方法
Like演算子とは
文字列のパターンを比較しTrue/Falseの値を返してくれる演算子です。文字列の比較では正規表現が代表的ですが、VBAでは基本的に正規表現は利用できません。その代わりにLike演算子を利用してパターンマッチングを行います。
Like演算子の構文と利用方法
Like演算子の構文(1)
次の比較が合えば「True」 =『比較したい文字列』 Like 『比較用に準備した文字列』
次の比較が違えば「False」 =『比較したい文字列』 Like 『比較用に準備した文字列』
※比較は先頭の文字から行われます。比較用に準備した文字列までの内容で不一致があればFalseとなります。
Like演算子の利用例(1)
サンプルプロシージャ1
比較したい文字列「”abcdefg”」が比較用に準備した文字列「”abcdefg”」に一致していれば「True」を返します。 |
Sub LikeOperator1()
If "abcdefg" Like "abcdefg" Then
MsgBox "文字列は一致しています。"
End If
End Sub
実行結果:条件はTrueとなります。
Like演算子の構文(2)
次の比較が合えばTrue =『比較したい文字列』 Like 『パターンマッチング規則』
次の比較が違えばFalse =『比較したい文字列』 Like 『パターンマッチング規則』
※比較は先頭の文字から行われます。パターンマッチング規則内で不一致があればFalseとなります。
Microsoft Learn を参考にすると次のように表現できます。
result = string Like パターン
resultに「True」か「False」が入ります。
stringに『比較したい文字列』
パターンに『パターンマッチング規則』
規則については実際に利用例を確認すると分かりやすいのでLike演算子の利用例(2)を早速確認していきます。
Like演算子の利用例(2)
サンプルプロシージャ2
「?」は任意の一文字を表現します。サンプルプロシージャでは左の文字列「abcdefg」が右の文字列「abc「任意の一文字」「任意の一文字」「任意の一文字」「任意の一文字」」と合っているかを確認しています。 |
Sub LikeOperator2()
If "abcdefg" Like "abc????" Then
MsgBox "文字列は一致しています。"
End If
End Sub
実行結果:条件はTrueとなります。
サンプルプロシージャ3
「*」は任意の0文字以上の文字を表現します。サンプルプロシージャでは左の文字列「abcdefg」が右の文字列「abc「0文字以上の文字」」と合っているかを確認しています。 |
Sub LikeOperator3()
If "abcdefg" Like "abc*" Then
MsgBox "文字列は一致しています。"
End If
End Sub
実行結果:条件はTrueとなります。
サンプルプロシージャ4
比較には変数を利用することができます。 |
Sub LikeOperator4()
Dim str1 As String
Dim str2 As String
str1 = "a1a2a3a"
str2 = "a1a??3a"
If str1 Like str2 Then
MsgBox "文字列は一致しています。"
Else
MsgBox "文字列パターンに一致しません。"
End If
End Sub
実行結果:条件はTrueとなります。
サンプルプロシージャ5
「#」は任意の一桁の数を表現します。サンプルプロシージャでは左の文字列「a1a2a3a」が右の文字列「a1a「任意の一文字」「任意の一桁の数値」3a4」と合っているかを条件で確認しています。「?」は一文字も一桁の数値も両方Trueを返しますが、#は比較対象が数値でないとFalseを返します。 ※今回は「#」と比較する内容が「a」なので「False」を返すことになります。 |
Sub LikeOperator5()
Dim str1 As String
Dim str2 As String
str1 = "a1a2a3a"
str2 = "a1a?#3a"
If str1 Like str2 Then
MsgBox "文字列は一致しています。"
Else
MsgBox "文字列パターンに一致しません。"
End If
End Sub
実行結果:条件はFalseとなります。
サンプルプロシージャ6
次のプロシージャは上のプロシージャの「?」と「#」の位置を変更した内容です。 ※今回は「#」と比較する内容が「2」なので「True」を返すことになります。 |
Sub LikeOperator6()
Dim str1 As String
Dim str2 As String
str1 = "a1a2a3a"
str2 = "a1a#?3a"
If str1 Like str2 Then
MsgBox "文字列は一致しています。"
Else
MsgBox "文字列パターンに一致しません。"
End If
End Sub
実行結果:条件はTrueとなります。
サンプルプロシージャ7
[ ]は[ ]に含まれる任意の一文字を表現します。サンプルプロシージャでは 左の文字列「abcdefg」が右の文字列「「aからzまでの任意の一文字」「aからzまでの任意の一文字」「aからzまでの任意の一文字」「aからzまでの任意の一文字」「aからzまでの任意の一文字」「aからzまでの任意の一文字」「aからzまでの任意の一文字」」と合っているかを条件で確認しています。 ※a-zの書き方について:「-」を利用すると『aからzまでの文字』と文字の範囲をアルファベット順で指定することができます。 |
Sub LikeOperator7()
Dim str1 As String
Dim str2 As String
str1 = "abcdefg"
str2 = "[a-z][a-z][a-z][a-z][a-z][a-z][a-z]"
If str1 Like str2 Then
MsgBox "文字列は一致しています。"
Else
MsgBox "文字列パターンに一致しません。"
End If
End Sub
実行結果:条件はTrueとなります。
サンプルプロシージャ8
上のプロシージャの繰り返しの部分をアスタリスクを利用して表現しています。アスタリスクは任意の0文字以上の文字という意味でした。 |
Sub LikeOperator8()
Dim str1 As String
Dim str2 As String
str1 = "abcdefg"
str2 = "[a-z]*"
If str1 Like str2 Then
MsgBox "文字列は一致しています。"
Else
MsgBox "文字列パターンに一致しません。"
End If
End Sub
実行結果:条件はTrueとなります。
サンプルプロシージャ9
大文字と小文字を分けて判断する時は次のプロシージャのように表現します。 |
Sub LikeOperator9()
Dim str1 As String
Dim str2 As String
str1 = "abcABC"
str2 = "[a-z]*cA[A-Z]*"
If str1 Like str2 Then
MsgBox "文字列は一致しています。"
Else
MsgBox "文字列パターンに一致しません。"
End If
End Sub
実行結果:条件はTrueとなります。
サンプルプロシージャ10
[ ]のなかで「!」を利用すると否定の意味になります。[!a-z]で「小文字のa からzでないパターン」という意味になります。 |
Sub LikeOperator10()
Dim str1 As String
Dim str2 As String
str1 = "abcABC"
str2 = "[!A-Z]*A[A-Z]*"
If str1 Like str2 Then
MsgBox "文字列は一致しています。"
Else
MsgBox "文字列パターンに一致しません。"
End If
End Sub
実行結果:条件はTrueとなります。
サンプルプロシージャ11
[ ]の外で「!」を利用すると!を文字として比較します |
Sub LikeOperator11()
Dim str1 As String
Dim str2 As String
str1 = "!abcABC"
str2 = "![!A-Z]*c[A-Z]*"
If str1 Like str2 Then
MsgBox "文字列は一致しています。"
Else
MsgBox "文字列パターンに一致しません。"
End If
End Sub
実行結果:条件はTrueとなります。
サンプルプロシージャ12
※文字列の比較は先頭から行われます。一致部分が先頭から評価されるのでパターンに合わない並び方があればその時点でFalseが返されます。 |
Sub LikeOperator12()
Dim str1 As String
Dim str2 As String
Dim str3 As String
Dim str4 As String
str1 = "!!!ABC!!!"
str2 = "???[A-Z]*!"
str3 = "???[A-Z][A-Z][A-Z][A-Z]"
str4 = "?[A-Z]*"
If str1 Like str2 Then
MsgBox "!!!ABC!!!と???[A-Z]*!であれば、先頭からの評価は「!!!ABC!」で一致しているのでTrueが返ります。"
End If
If str1 Like str3 Then
Else
MsgBox "!!!ABC!!!と???[A-Z][A-Z][A-Z][A-Z]であれば、先頭から評価していくと最後の[A-Z]で不一致となるのでFalseが返ります。"
End If
If str1 Like str4 Then
Else
MsgBox "!!!ABC!!!と?[A-Z]*であれば、先頭から評価していくと二文字目で不一致となるのでFalseが返ります。"
End If
End Sub
1つ目の実行結果:条件はTrueとなります。
2つ目の実行結果:条件はFalseとなります。
3つ目の実行結果:条件はFalseとなります。
今回の内容は以上となります。
ブックマークのすすめ
「ほわほわぶろぐ」を常に検索するのが面倒だという方はブックマークをお勧めします。ブックマークの設定は別記事にて掲載しています。