VBAで文字列を検索する際に便利なのが InStr関数 です。
特定の単語や文字を含むかどうかを調べたり、
検索結果を条件分岐に活用することで、効率的なデータ処理が可能になります。
本記事では、InStr関数の基本的な使い方から応用例、エラー対策 までを詳しく解説します。
-著者情報-
名前:Utatane
VBA(マクロ)歴:3年
Excel使用歴:15年以上
ひとこと:初心者だった当時に戻った気持ちになって解説いたします
InStr関数とは?(Excelマクロ)
InStr関数は、指定した文字列の中から 特定の文字列を検索し、その位置を返す 関数です。
なかなかピンと来ないと思いますので、一例を見てみましょう。
「abcdef」という文字列があるとします。
この中から「c」が何文字目にあるかを知りたい場合に「InStr関数」が便利です。
この場合は「c」は3文字目なので、「3」という回答が返ってきます。
これだけで使うことは稀ですが、例えば「Left」関数と組み合わせて「c(3文字目)」まで(abc)を抜き取るという使い方もできます。
では、「InStr関数」の使い方を見ていきましょう。
InStr関数の使い方
まずは簡単な使い方をお見せします。
簡単な使い方
下記のVBAコードを見てください。
Sub 文字検索()
Dim num As Integer
num = InStr("My name is Utatane", "U")
Debug.Print num ' → 12("U"の開始位置)
End Sub
2行目・4行目の解説は割愛します。下記記事をご参考ください。
num = InStr("My name is Utatane", "U")
3行目の解説です。
InStr関数にて、特定の文字の場所を検索し、変数に格納しています。
今回は「My name is Utatane」という文字列の中から「U」の場所を探し、変数「num」に格納した例です。
【 変数名 = InStr(対象文字列, 検索文字列) 】
今回は「U」が12文字目だったため、「12」が変数「num」に格納されます。
(スペースも1文字に含まれます)

ここで以下のような疑問が生まれるかと思います。
- 検索文字列は1文字だけしか指定できないの?
- 対象文字列の中に検索文字列が無かったらどうなるの?
- 大文字小文字は区別されるの?
- 対象文字列の中に2つ以上の検索文字列があったらどうなるの?
1つ1つ解説いたします。
まず、2文字以上の検索文字列を指定できます。
num = InStr("My name is Utatane", "Utatane")
結果は前回と同じです。

「Utatane」の「U」つまり、先頭の文字の場所が返ってくると思ってください。
次に、対象文字列の中に検索文字列が無かった場合、0が返されます。
num = InStr("My name is Utatane", "k")

デフォルトでは「大文字小文字を区別する」という設定になっています。
下記のように「小文字のu」を指定した場合、見つかりません。
num = InStr("My name is Utatane", "u")
この場合も「0」が返されます。
大文字小文字を区別しない設定については「少し高度な使い方」で解説しています。
対象文字列の中に、2つ以上の検索文字列が含まれる場合、一番初めに見つかった文字の場所が返されます。
num = InStr("My name is Utatane", "a")

「a」は「5文字目」「14文字目」「16文字目」にありますが、最初の「5文字目」が返されます。
2番目の「a」の場所を知ることも可能です(少し高度な使い方を参照)
「InStr」関数の簡単な使い方がだいたいわかりましたでしょうか?
今度はもう少し高度な使い方を見ていきましょう。
【InStr関数の特徴】
- 対象文字列の中にある検索文字列の場所(何文字目か)を返す(スペース含む)
- 2文字以上の検索文字列を指定することも可能(1文字目の場所が返される)
- 対象文字列の中にある検索文字列が無かった場合は「0」を返す
- 対象文字列の中に2つ以上の検索文字列が含まれる場合、一番初めに見つかった文字の場所を返す
- デフォルトでは、大文字小文字を区別する
少し高度な使い方
大文字小文字を区別したくない場合は、比較方法を指定します。
【 変数名 = InStr(対象文字列, 検索文字列, 比較方法) 】
下記のVBAコードを見てください。
num = InStr("My name is Utatane", "u", vbTextCompare)

前項では大文字小文字が区別されていたので、「0」(値なし)が返されました。
今回は大文字小文字が区別されなくなり、「12」が返されます。
- vbTextCompare:大文字小文字を区別しない
- vbBinaryCompare:大文字小文字を区別する(デフォルト/省略した場合)
検索の開始位置を指定することもできます。
【 変数名 = InStr(開始位置, 対象文字列, 検索文字列) 】
開始位置は、対象文字列の検索を開始する位置です。
(1を指定すると「M」から、2を指定すると「y」から…)
開始位置の記述を省略した場合は、1文字目が開始位置となります。
前項で「対象文字列の中に、2つ以上の検索文字列が含まれる場合、一番初めに見つかった文字の場所が返される」とお伝えしました。
num = InStr("My name is Utatane", "a") ' 1番目のaである5文字目が返される

開始位置を指定することで、2番目以降の「a」の位置を知ることができます。
下記VBAコードでは、開始位置を6文字目以降にしているため、「m」から検索がスタートします。
num = InStr(6, "My name is Utatane", "a") ' 2番目のaである14文字目が返される
「My name is Utatane」の赤文字が検索対象となります。
しかしながら、返される位置は、文字列すべて(My name is Utatane)から計算されるため、「14」となります。
(9とはならない)

応用例
「InStr」関数を使った応用例を2つ紹介いたします。
複数の文字列を検索(And/Or)
1つの対象文字列の中から、2種類の検索文字列を探し出し、どちらか(もしくは両方)が含まれていることを確認しることができます。
下記のVBAコードは、If~Orを使って、どちらかの検索文字列が含まれているかを確認した例です。
Sub 応用例1()
If InStr("My name is Utatane", "a") > 0 Or InStr("My name is Utatane", "b") > 0 Then
Debug.Print "どちらかの文字列が含まれています"
End If
End Sub
「If~Or」「If~And」の使い方については、下記記事をご参考ください。
キーワードを含む行を抽出(ループ処理)
下記VBAコードは、Excelのセル内に検索文字列(”重要”)が含まれる場合、
隣のセル(B列)に「要チェック」と書き込みする例です。
Sub 応用例2()
Dim i As Integer
For i = 1 To 5
If InStr(1, Cells(i, 1).Value, "重要") > 0 Then
Cells(i, 2).Value = "要チェック"
End If
Next i
End Sub

A1~A5までのループ進行にはFor文を使用しています。
下記記事でわかりやすく解説しておりますので、ご参考ください。
うまく動作しないときの対処法
エラーが発生する
コンパイルエラー・実行時エラー
コードに問題がある場合が多いです。
「”」や()など、2つセットの記号が片方だけになっていないかなど、コードを再確認しましょう。
セル名を「”」で囲っていない場合でもエラーが発生します。
警告表示

上記の表示が出た場合は、マクロが無効になっています。
Excelに表示された「コンテンツの有効化」をクリックするか、下記記事を参考にセキュリティ設定を変更してください。
最後に
VBAのInStr関数について解説いたしました。
当ブログでは、VBAマクロやPythonなど、時間を生み出すプログラミング術を公開しております。
この記事がわかりやすいと感じた方は、他の記事も読んでいってください。
最後までお読みいただき、ありがとうございました。がんばってください!