文字列を部分一致で比較するLike演算子の使い方を解説します。
- ワイルドカード「*」を利用した部分一致判定
- Like演算子の条件に変数やセルの値を使用したい場合
- Like演算子をNot/And/Orと併用する場合
- Like演算子を使ったパターンマッチング(文字数や文字種を指定した判定)
- Instr関数を使用する方法
ワイルドカード「*」を利用した部分一致判定
Like演算子を使う方法で最も簡単かつ便利なのが、
ワイルドカードと呼ばれる記号「*」を使うコードです。
「*」は「この部分は任意の文字列」という意味で、
例えば「○○空港」のデータを抽出したい際に、
「*空港」という条件文で判定することができます。
本家Excelにおいても
=COUNTIF(A:A,"*空港") |
という数式で○○空港のデータ数を数えることが出来ますが、
Like演算子も同様にワイルドカード「*」を使用することができます。
基本形
If 判定したい文字列 Like 条件文 Then 合致した場合の処理 End If
使用例
' 前方一致(セル値が東京都○○か判定) If Cells(R, 1) Like "東京都*" Then ' 後方一致(セル値が○○空港か判定) If Cells(R, 1) Like "*空港" Then ' 中間一致(セル値が○○-a-△△か判定) If Cells(R, 1) Like "*-a-*" Then ' 形式の判定(セル値がハイフンを3つ含むか判定) If Cells(R, 1) Like "*-*-*-*" Then
解説
Likeは比較演算子ですので、サンプルの様にIf文の中で使うことが多いと思います。
位置的には「=の代わりに使える」と覚えるとわかりやすいですね。
ただし=と異なり、左右を逆に書くことはできません。
「*」入りの条件式は右辺に置く必要があります。
ワイルドカード「*」の特長として、条件文中に何度も使用することができます。
サンプルの最後で使用した「*-*-*-*」などで、
「ハイフンを3つ含む」といった判定が行えます。
ただし、「*」は0文字以上の任意の文字列、つまり""も含むため、
If "---" Like "*-*-*-*" Then
これはTrueとなることにご注意ください。
(1文字以上とする方法は後述します)
Like演算子の条件に変数やセルの値を使用したい場合
Like演算子の条件に変数やセルの値を使用したい場合は、
&を使って「*」と変数/セル値を結合してください。
' 変数を使用した判定 Dim 後方一致条件 As String 後方一致条件 = "空港" If 判定したい文字列 Like "*" & 後方一致条件 Then
' セル値を使用した判定 If 判定したい文字列 Like "*" & Cells(R, 1) Then
Like演算子の右辺は最終的に文字列になっていればOKです。
Like演算子をNot/And/Orと併用する場合
Like演算子はTrue/Flaseを返す演算子ですので、
Dim 判定結果 As Boolean 判定結果 = 判定したい文字列 Like 条件文 If 判定結果 Then
こんな形で書くことも可能です。
Ifステートメントの一種と誤解されている方がたまにいらっしゃいますが、
If 判定したい文字列 Like 条件文 Then
↑これ全体でひとつの構文というわけではありません。
単にLikeが返すTrue/FalseをIfステートメントで使用しているだけです。
つまり「A Like B」をただのTrue/Falseと思って良いということですね。
よって、例えば「Likeが合致しない判定」を行う場合は、
If Not (判定したい文字列 Like 条件文) Then ' または If (判定したい文字列 Like 条件文) = False Then
このコードで判定を行うことができます。
また、他の条件式と組み合わせる場合は、
If (Cells(R, 1) Like "*-*-*-*") And (Len(Cells(R, 1)) = 12) Then
と、Like部分をカッコでくくることで、AndやOrと併用することが可能です。
このサンプルでは「12文字かつハイフンが3つ」かを判定しています。
ちなみにここで使用したカッコは実はなくても動くのですが、
省略しても読みづらくなるだけですので、カッコはしっかり付けましょう。
カッコを付けるかどうかは、「システム上必要かどうか」ではなく、
「どう書くと読みやすいか」という観点で判断してください。
Like演算子を使ったパターンマッチング(文字数や文字種を指定した判定)
Like演算子は文字数や文字種の指定をすることも可能です。
例えば商品コードなどが「1234-aa-01-002」という形式になっている場合に、
この条件を満たしているかどうかは、
If 判定したい文字列 like "####-[a-z][a-z]-##-###" Then
で判定することができます。
"####-[a-z][a-z]-##-###"
この条件式は、
- 数字4桁-アルファベット小文字2桁-数字2桁-数字3桁
であるかを判定しています。
直感的にも読みやすい記述ですよね。
特にExcelVBAではこのような○○コードの判定に便利です。
このような文字数・文字種を絞った判定をパターンマッチングと呼び、
Like演算子によって以下のパターンを指定することができます。
記号 | 判定 |
---|---|
* | 任意の文字列(0文字も含む) |
? | 任意の1文字 |
# | 任意の数字1文字 |
[ABC] | A,B,Cのいずれか1文字 |
[!ABC] | A,B,Cではない1文字 |
[A-Z] | A~Zの内の1文字 |
[!A-Z] | A~Zでない1文字 |
先ほどの例「1234-aa-01-002」を、
"####-[a-z][a-z]-##-###"
で判定したサンプルの様に、組み合わせて使用してください。
特に
- n桁の数値は「###...(n個)」
- 任意の文字列(1文字以上)は「?*」または「*?」
の2つは、覚えておくと役に立つと思います。
また、[ ]による表記は日本語(2バイト文字)でも利用できます。
[あ-ん]でひらがな全体になりますし、[あ-お]であ行にもなります。
ただし、[か-こ]には[がぎぐげ]も入ってしまい、しかし[ご]が入りません。
[か-ご]でマッチするか、[かきくけこ]とストレートに記載してください。
なお、パターンマッチング記号を普通の文字として使いたい場合は、
[!]や[*]といったように[]でくくります。
例えば「テキストの語尾が?かどうか」を判定する場合は、
If テキスト全体 Like "*[?]" Then
という条件文によって判定することが可能です。
Instr関数を使用する方法
Like演算子はかなり広範囲の文字列比較に対応していますが、
このうち単純な判定である
' 前方一致(セル値が東京都○○か判定) If Cells(R, 1) Like "東京都*" Then ' 中間一致(セル値が○○-a-△△か判定) If Cells(R, 1) Like "*-a-*" Then
この2つは、Instr関数で行うこともできます。
' 前方一致(セル値が東京都○○か判定) If Instr(Cells(R, 1), "東京都") = 1 Then ' 中間一致(セル値が○○-a-△△か判定) If Instr(Cells(R, 1), "-a-") > 0 Then
どちらも十分に高速で、速度面ではどちらを使ってもよいです。
書きやすい/読みやすい方を採用してください。
以上でLike演算子の解説を終了します。
Like演算子は簡単に扱える上に、とても便利な演算子です。
文字列操作の中でも重要な機能ですので、ぜひとも修得していってください。