Excel VBAでInStr関数の使い方をお探しですね。
広告
Excel VBAで文字列に特定のキーワードが含まれるか調べる方法【InStr関数の使い方】
Excel VBAでセルや文字列の中に「東京」「完了」「株式会社」などの特定キーワードが含まれているかを調べたい場面って、意外とよくありますよね。
完全一致なら「=」で比較できますが、住所・商品名・備考欄のように「文字列の一部だけを調べたい」という場合は、部分一致の検索が必要になります。
この記事では、Excel VBAのInStr関数を使って、特定の文字列が含まれるかを判定する方法を、基本の書き方から実務で使いやすいコツ、Like演算子との使い分けまで、わかりやすく解説していきます。
InStr関数で「含まれるか」を調べる基本のキ
Excel VBAで「この文字列の中に、あの言葉が入ってるかな?」を調べるときに便利なのが、**InStr関数**です。
InStr関数は、検索したい文字列の中から指定した言葉を探して、**見つかった位置を数字で教えてくれます**。
たとえば「東京都新宿区」という文字列から「新宿」を探すと、「新宿」は4文字目から始まるので、戻り値は「4」になります。
逆に、探している文字列が見つからなかった場合は「0」を返します。
この**「見つかったら1以上、見つからなければ0」**という性質を利用して、部分一致の判定ができるんです。
基本の書き方はこんな感じです。
If文と組み合わせることで、指定した文字列を含む場合だけ処理を実行できます。
“`vb
Sub Sample_InStr_Basic()
Dim text As String
text = “東京都新宿区”
If InStr(text, “新宿”) > 0 Then
MsgBox “新宿を含んでいます”
Else
MsgBox “新宿を含んでいません”
End If
End Sub
“`
ポイントは、InStr関数の戻り値を**「0より大きいかどうか」で判定する**ことです。
見つかった位置が1文字目でも10文字目でも、含まれていれば戻り値は必ず1以上になります。
なので、部分一致の判定では `If InStr(対象文字列, 検索文字列) > 0 Then` という形が一番読みやすくて、初心者の方にも理解しやすい書き方です。
`<> 0`(0じゃない)と書いても同じ意味になりますが、「含まれている」ことを明確に表現できる `> 0` の方が実務では扱いやすいですよ。
InStr関数の正式な構文は、`InStr([開始位置,] 文字列, 検索文字列[, 比較方法])` です。
開始位置と比較方法は省略できます。
省略した場合は、1文字目から検索して、大文字と小文字、全角と半角などを区別して比較します。
まずは `InStr(対象文字列, 探したい文字列)` の形を覚えて、必要に応じて開始位置や比較方法を追加していくと、無理なく使いこなせるようになります。
実務でよく使う!セルの値を判定するサンプル
InStr関数は、変数に入った文字列だけじゃなく、**セルの値に対してもそのまま使えます**。
Excel VBAでよくあるのは、こんなケースです。
– A列の住所に「東京」が含まれている行だけ処理したい
– 備考欄に「至急」が含まれていれば色を付けたい
– ファイル名に特定の文字列が含まれているか確認したい
完全一致では拾えないデータを柔軟に判定できるので、データ整理やチェック用マクロで本当に役立ちます。
たとえば、アクティブセル(今選んでいるセル)に「東京」が含まれているかを判定するなら、こう書けます。
“`vb
Sub Sample_ActiveCell()
If InStr(ActiveCell.Value, “東京”) > 0 Then
MsgBox “東京を含んでいます”
Else
MsgBox “東京を含んでいません”
End If
End Sub
“`
複数のセルを対象にする場合は、For Each文と組み合わせると実務的です。
次の例では、A1からA10までのセルを調べて、「東京」を含むセルの背景色を黄色にしています。
“`vb
Sub Sample_CellLoop()
Dim c As Range
For Each c In Range(“A1:A10”)
If InStr(c.Value, “東京”) > 0 Then
c.Interior.Color = vbYellow
End If
Next c
End Sub
“`
このように、InStr関数は「含まれているかどうか」を判定するだけじゃなく、判定結果をもとにセルの色を変えたり、別シートへ転記したり、対象行だけ集計したりと、いろんな処理の入口として使えます。
VBAでは、条件分岐の精度がマクロの使いやすさを大きく左右します。
特に、ユーザーが入力する文字列や外部から取り込んだデータは表記が一定じゃないことが多いので、部分一致で判定できるInStr関数を覚えておくと、実務で対応できる範囲がグッと広がりますよ。
「含まない」「で始まる」の判定も簡単
「含まない場合」を判定したいときは、戻り値が0であることを確認します。
たとえば「東京」を含まないセルだけ処理したい場合は、`If InStr(c.Value, “東京”) = 0 Then` と書きます。
さらに、指定した文字列で始まるかを判定したい場合は、**戻り値が1かどうか**を見ます。
`If InStr(c.Value, “東京”) = 1 Then` とすれば、「東京都千代田区」は該当しますが、「本社:東京」は該当しません。
– **部分一致**: `> 0`
– **含まない**: `= 0`
– **前方一致(で始まる)**: `= 1`
この3つの違いを整理しておくと、条件分岐がかなり書きやすくなります。
ちょっと応用編:開始位置・大文字小文字の区別・複数検索
InStr関数は、単に文字列を含むか調べるだけじゃなく、**検索を始める位置も指定できます**。
構文は `InStr(開始位置, 対象文字列, 検索文字列)` です。
たとえば、10文字目以降に「完了」が含まれるかを調べたい場合は、`InStr(10, text, “完了”) > 0` のように書きます。
注意したいのは、**開始位置を指定する場合、引数の順番が変わる**ことです。
`InStr(text, “完了”)` の形に慣れていると、開始位置を追加したときに書き間違えやすいので、必要な場面では構文を確認しながら使うと安全です。
大文字と小文字を区別しない検索
大文字と小文字を区別せずに検索したい場合は、第4引数に `vbTextCompare` を指定します。
通常の比較では「ABC」と「abc」は別の文字列として扱われますが、`vbTextCompare` を使うと同じものとして判定できます。
英字の商品コードやユーザー入力値を扱う場合、入力者によって大文字・小文字が揺れることがあるので、比較方法の指定は実務で重要です。
“`vb
Sub Sample_TextCompare()
Dim text As String
text = “Order-ABC-001”
If InStr(1, text, “abc”, vbTextCompare) > 0 Then
MsgBox “abcを含んでいます”
End If
End Sub
“`
ここで重要なのは、**第4引数を指定する場合は開始位置も明示する必要がある**ことです。
つまり、`InStr(text, “abc”, vbTextCompare)` のようには書けません。
1文字目から検索したい場合でも、`InStr(1, text, “abc”, vbTextCompare)` と書きます。
同じ文字列が何回含まれているか数える
同じ文字列が何回含まれているかを調べたい場合は、InStr関数とループ処理を組み合わせます。
検索開始位置を少しずつ進めながら、見つからなくなるまで繰り返す考え方です。
“`vb
Sub Sample_CountKeyword()
Dim text As String
Dim keyword As String
Dim pos As Long
Dim count As Long
text = “東京本社、東京支店、東京営業所”
keyword = “東京”
pos = 1
Do
pos = InStr(pos, text, keyword)
If pos > 0 Then
count = count + 1
pos = pos + Len(keyword)
End If
Loop While pos > 0
MsgBox keyword & ” は ” & count & ” 回含まれています”
End Sub
“`
このサンプルでは、検索文字列が見つかったらカウントを増やして、次の検索開始位置をキーワードの長さ分だけ進めています。
これで、同じ文字列が複数回登場する文章でも正しく回数を数えられます。
単純な「含む判定」だけなら1行で済みますが、検索位置を利用すれば、出現回数の確認や特定文字の前後を取り出す処理にも応用できますよ。
Like演算子との違いと、失敗しないための注意点
VBAで部分一致を判定する方法には、InStr関数のほかに**Like演算子**もあります。
Like演算子は、ワイルドカード(*)を使って文字列のパターンを判定する機能です。
たとえば、`If text Like “*東京*” Then` と書けば、「東京」を含むかを判定できます。
単純な部分一致であればInStr関数でもLike演算子でも実現できますが、考え方は少し違います。
– **InStr関数**: 「見つかった位置」を返す関数
– **Like演算子**: 「パターンに一致するか」をTrue/Falseで返す演算子
どっちを使えばいいの?使い分けの目安
単純に「特定の文字列を含むか」を調べるだけなら、**InStr関数の方が意図を読み取りやすい**場面が多いです。
`InStr(text, “東京”) > 0` は「東京を探して、見つかったら処理する」という意味がそのまま伝わります。
一方、Like演算子は `*` や `?`、`[A-Z]` などのパターン指定が使えるので、「数字で始まる」「任意の1文字を含む」「特定範囲の文字に一致する」といった条件に向いています。
つまり、**固定文字列の検索はInStr関数、パターンマッチングはLike演算子**と考えると使い分けやすくなります。
使い分けの目安を簡単に整理すると、こんな感じです。
– **固定の文字列を含むか調べる** → InStr関数が読みやすい
– **前方一致を調べる** → InStr関数なら戻り値が1かどうかで判定できる
– **ワイルドカードを使った複雑な条件** → Like演算子が向いている
– **検索位置や出現回数を使いたい** → InStr関数が適している
InStr関数でよくある失敗と注意点
InStr関数で失敗しやすい点として、**ワイルドカードが使えない**ことがあります。
たとえば、`InStr(text, “東京*区”)` と書いても、「東京で始まり区で終わる文字列」を探す意味にはなりません。
この場合、InStr関数は `*` を特別な記号じゃなく、普通のアスタリスク文字として検索します。
ワイルドカードを使いたい場合はLike演算子を選ぶ必要があります。
この違いを理解していないと、コードはエラーにならないのに期待通りの結果にならないので注意が必要です。
もう一つの注意点は、**セルの値がエラー値やNullを含む可能性がある場合**です。
通常のExcelセルであれば空白セルに対してInStrを使っても大きな問題になりにくいですが、Access連携や外部データを扱う場合、Nullが混ざることがあります。
Nullは「値が存在しない」状態を表すので、そのまま文字列関数に渡すと想定外の結果やエラーの原因になります。
必要に応じて `If Not IsNull(value) Then` のように確認したり、Excelのセル処理では `CStr(c.Value)` で文字列化したりすると、より安全なコードになります。
まとめ:InStr関数の基本形を押さえよう
Excel VBAのInStr関数で特定の文字列が含まれるかを判定する基本形は、こちらです。
“`vb
If InStr(対象文字列, 検索文字列) > 0 Then
“`
この形を押さえたうえで、こんな風に整理すると実務で迷いにくくなります。
– **含まない場合** → `= 0`
– **先頭にある場合** → `= 1`
– **大文字小文字を区別しない** → `vbTextCompare`
– **複雑なパターン判定** → Like演算子
文字列検索は、データ抽出、チェック、分類、置換前の判定など、多くのマクロで土台になる処理です。
InStr関数の戻り値の意味を理解しておけば、部分一致の条件分岐を安定して書けるようになりますよ。
ぜひこの記事を参考に、実務で使えるVBAコードを書いてみてくださいね!
広告
