和風スパゲティのレシピ

日本語でコーディングするExcelVBA

文字列を部分一致で比較する - Like演算子

文字列を部分一致で比較するLike演算子の使い方を解説します。

ワイルドカード「*」を利用した部分一致判定

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


どちらも十分に高速で、速度面ではどちらを使ってもよいです。

書きやすい/読みやすい方を採用してください。

www.limecode.jp



以上でLike演算子の解説を終了します。


Like演算子は簡単に扱える上に、とても便利な演算子です。

文字列操作の中でも重要な機能ですので、ぜひとも修得していってください。