【VBAマクロ】InStr関数の使い方|文字列検索の基本から応用まで徹底解説

スポンサードリンク
VBA

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文字目が返される
1番目のaの場所

開始位置を指定することで、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とはならない)

2番目のaの場所

応用例

「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
応用例2の結果

A1~A5までのループ進行にはFor文を使用しています。
下記記事でわかりやすく解説しておりますので、ご参考ください。

スポンサードリンク

うまく動作しないときの対処法

エラーが発生する

コンパイルエラー・実行時エラー

コードに問題がある場合が多いです。
「”」や()など、2つセットの記号が片方だけになっていないかなど、コードを再確認しましょう。
セル名を「”」で囲っていない場合でもエラーが発生します。

警告表示

マクロが無効になっている表示

上記の表示が出た場合は、マクロが無効になっています。
Excelに表示された「コンテンツの有効化」をクリックするか、下記記事を参考にセキュリティ設定を変更してください。

スポンサードリンク

最後に

VBAのInStr関数について解説いたしました。

当ブログでは、VBAマクロやPythonなど、時間を生み出すプログラミング術を公開しております。
この記事がわかりやすいと感じた方は、他の記事も読んでいってください。

最後までお読みいただき、ありがとうございました。がんばってください!

タイトルとURLをコピーしました