和風スパゲティのレシピ

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

文字列を含むか判定する - Instr関数/Like演算子

文字列内に特定の文字列があるかを判定する方法を解説します。

Instr関数を使う方法と、Like演算子を使う方法の2種類があります。

Instr関数を使う方法

VBAにはInStr関数という文字列が何文字目に登場するか検索する関数があります。

シート関数でいうところのFIND関数SEARCH関数に該当し、
引数の順番が違うだけでほとんど同じ動きをします。


Instr関数を用いて、文字列がある文字列を含むか判定するコードがこちらです。

' 文字列が判定文字列を含む時だけ処理を実行
If InStr(文字列全体, 判定文字列) > 0 Then
    
    ' ここに処理

End If

 
Instr関数は文字列が見つからなかったときは「0」を返しますので、
見つかったかどうかは「>0」で判定することができます。


文字列を前方一致(ある文字列から始まっているか)で判定したい場合は、
以下のように「結果が1=1文字目に発見時」を判定すればOKです。

' 文字列が判定文字列から始まるときだけ処理を実行
If InStr(文字列全体, 判定文字列) = 1 Then

 
またInstr関数は検索開始位置も指定可能ですので、
例えば10文字目以降に含むか判定したい場合は以下のコードを実行します。

' 判定文字列が10文字目以降に含まれるときだけ処理を実行
If InStr(10, 文字列全体, 判定文字列) > 0 Then

 
FIND/SEARCH関数と違って、開始位置指定は第1引数なので注意してください。


しかしながら第1引数が文字列の場合は開始位置が省略されたとみなし、
第2引数と第3引数を繰り上げて使用してくれる珍しい関数
です。

If InStr(文字列全体, 判定文字列) > 0 Then
' ↕ 同じ動きになる。省略した引数を左に詰めてくれる珍しい挙動
If InStr(1, 文字列全体, 判定文字列) > 0 Then

 
このように引数をスライドして使ってくれる関数は、
私の知る上ではこのInstr関数(+InstrRev/B関数)だけです。不思議。


最後に、Instr関数は大文字小文字の区別をしない設定にもできます。

AAAでもaaaでも見つかったとみなしたい場合は、
第4引数に「vbTextCompare」を指定して判定してください。

If InStr(1, 文字列全体, 判定文字列, vbTextCompare)

この場合は第1引数の省略ができませんので。
文字列全体を(=1文字目から)判定したい場合は「1」を指定します。

Like演算子を使う方法

続いてLike演算子を使う方法です。

Like演算子は文字列を部分一致判定してくれる演算子で、
文字列を含むかどうかを判定するには以下のコードを使用します。

' 文字列が判定文字列を含む時だけ処理を実行
If 文字列全体 Like "*" & 判定文字列 & "*" Then
    
    ' ここに処理

End If

 
Like演算子は「+」や「=」と同じ「演算子」ですので、
「○○ Like △△」という記述で使用します。

「=」と同じ「結果をTrue/Falseで返す比較演算子」ですので、
If ○○ Like △△ Then という記述になっています。


「"*" & 判定文字列 & "*"」の"*"はいわゆるワイルドカードで、
ここに任意の文字列が入ることを意味します。

例えば「*みかん*」とすればみかんを含むか判定してくれますし、
「みかん*」とすれば前方一致、「*みかん」とすれば後方一致判定になります。


今回は変数を使ったため、&を使った少々読みづらいコードになっていますが、
判定する文字列が固定の場合は、

If 文字列全体 Like "*みかん*" Then

このように直接文字列ないに「*」を打ち込んでしまって大丈夫です。

どちらの方法を使うべきか

上記2つの方法でどちらを使うかの判断ですが、
速度面など、システム仕様上は特に差はありません。

よって、その時々で書きやすい方、読みやすい方を使ってOKです。


例えば「単純にただ含むか判定する場合」は、
それが明確に伝わるInstr関数の方が読みやすそうです。

If Instr(文字列全体, "みかん") > 0 Then

If 文字列全体 Like "*みかん*" Then

後者は「*」を位置を読み解かないとすぐにはわかりませんからね。


また、判定文字列に変数を使うコードの場合は、
「"*" & 判定文字列 & "*"」←このコードを書くのが割と面倒というのはあります。

この場合もInstr関数がよさそうですね。


ということで単純な判定ではInstr関数の方が書きやすいのですが、
Like演算子の方がより高度な判定ができるという違いがあります。


例えば「文字列のカッコ内にみかんがあるか」を判定するとき、
Like演算子なら以下のコードで簡単に実装できます。

If 文字列全体 Like "*(*みかん*)*" Then

 
対してInstr関数だと、「(」「みかん」「)」をすべて検索したうえで、
登場順を判定しなければいけないためかなり大変です。


またLike演算子には「*」以外にもパターンの指定ができ、
以下のパターンマッチングが可能です。

記号 判定
* 任意の文字列(0文字も含む)
? 任意の1文字
# 任意の数字1文字
[ABC] A,B,Cのいずれか1文字
[!ABC] A,B,Cではない1文字
[A-Z] A~Zの内の1文字
[!A-Z] A~Zでない1文字


複雑な判定をするならLike演算子に軍配が上がりますので、
状況に応じて使い分けてみてください。


Like演算子の詳しい解説はこちらの記事をどうぞ。
www.limecode.jp