更新日:、 作成日:

VBA InStr 関数:文字列の位置を検索する

はじめに

Excel VBA マクロの InStr 関数から文字列の位置を検索する方法を紹介します。

InStr 関数は、文字列を検索して最初に見つかった位置を返します。

あいう から を検索したら 1 を返します。

検索ワードが見つからないときは 0 を返します。

大文字と小文字を区別するか選択できます。

文字列の中から検索ワードの位置を取得したいときに使用します。

文字数をバイト数として扱うには「InStrB 関数」を使用します。
後ろから検索するには「InStrRev 関数」を使用します。
文字列を検索するには「文字列を検索する」をご覧ください。

InStr 関数の引数と戻り値

InStr(検索元, 検索ワード)
検索元の文字列から検索ワードが最初に見つかった位置を取得します。

InStr(開始位置, 検索元, 検索ワード, 比較モード)
指定した開始位置から検索できます。比較モードで大文字と小文字を区別するか指定できます。

引数「開始位置」省略できます。何文字目から検索するかを指定します。
引数「検索元」検索元の文字列を指定します。
引数「検索ワード」検索するキーワードを指定します。
引数「比較モード」省略できます。大文字と小文字を区別して検索するかを指定します。
戻り値の型数値型 (Long)

引数「比較モード」

単位 説明
vbBinaryCompare (既定)「大文字と小文字」、「半角と全角」、「ひらがなとカタカナ」を区別する。
vbTextCompare区別しない。

解説

引数「検索ワード」が見つからないときは 0 を返します。1 文字目で見つかったときは 1 を返します。

文字列が含まれているか判定したいときは、0 なら存在しない、1 以上なら存在します。

引数「検索ワード」が空文字 "" なら、引数「開始位置」を返します。引数「開始位置」を省略したときは、1 を返します。

引数「検索ワード」が一致するすべての位置を取得するには 0 を返すまでループする必要があります。

引数「開始位置」を省略すると 1 文字目から検索します。

引数「開始位置」が 1 なら前から 1 文字目、2 なら 2 文字目から検索します。

引数「開始位置」が引数「検索元」の文字数を超えるときは 0 を返します。

引数「比較モード」を省略すると、大文字と小文字などを区別します。

引数「比較モード」を指定するときは、必ず引数「開始位置」も指定します。

引数「検索元」の後ろから検索するには「InStrRev 関数」を使用します。

セルの位置を検索するには「セルを検索する」をご覧ください。

使用例

InStr 関数の使用例を紹介します。

文字列の位置を検索する

文字列の位置を検索します。

Dim l As Long
l = InStr("ABCABC", "Z")
Debug.Print(l) ' 0

l = InStr("ABCABC", "A")
Debug.Print(l) ' 1

l = InStr("ABCABC", "C")
Debug.Print(l) ' 3

l = InStr(2, "ABCABC", "A") ' 2 文字目から検索
Debug.Print(l) ' 4

l = InStr("ABCABC", "CA") 
Debug.Print(l) ' 3

l = InStr("ABCABC", "")  ' 空文字なら開始位置
Debug.Print(l) ' 1

l = InStr("abcABC", "A") ' 省略すると大文字小文字を区別する
Debug.Print(l) ' 4

l = InStr(1, "abcABC", "A", vbBinaryCompare) ' 区別する
Debug.Print(l) ' 4

l = InStr(1, "abcABC", "A", vbTextCompare)   ' 区別しない
Debug.Print(l) ' 1

l = InStr(1, "アイウアイウ", "ア", vbBinaryCompare) ' 区別する
Debug.Print(l) ' 4

l = InStr(1, "アイウアイウ", "ア", vbTextCompare)   ' 区別しない
Debug.Print(l) ' 1

l = InStr(1, "あいうアイウ", "ア", vbBinaryCompare) ' 区別する
Debug.Print(l) ' 4

l = InStr(1, "あいうアイウ", "ア", vbTextCompare)   ' 区別しない
Debug.Print(l) ' 1

すべての位置を検索する

検索ワードが複数見つかるときは、0 を返すまでループしてすべての位置を取得できます。

Dim i As Integer ' 開始位置
i = 0

Do
    i = InStr(i + 1, "ABCABCABC", "A") ' A をすべて検索する
    Debug.Print(i) ' 1 4 7 0  
Loop Until i = 0

引数「検索ワード」が空文字なら 0 を返さないので、そのときはループできません。