InStr


構文

引数 start は省略可能です。検索を始める位置を指定します。

引数 string1 には、検索の対象となる文字列を指定します。

引数 strign2 には、引数string1の中から検索する文字列を指定します。

引数 compare は省略可能です。文字列を比較するモードを指定します。

解説

InStr関数は、引数string1で指定した文字列の中から、引数string2で指定した文字列を検索して、見つかった位置を返します。たとえば、

は、数値の「4」を返します。

一般的に、文字列の先頭から探しますので、引数startは省略されることが多いです。

文字列を、バイナリモードで比較する(探す)か、テキストモードで比較するかを、引数compareで指定できますが、バイナリモードで比較することはほとんどないので、一般的にこの引数は省略されます。

引数string2で指定した文字列が見つからなかったときや、引数に空欄("")を指定したときなどに、InStr関数が返す値は次のとおりです。

内容 返り値
引数string1が空欄("")のとき 0
引数string1がNull値のとき Null値
引数string2が空欄("")のとき 引数startに指定した値
引数string2がNull値のとき Null値
引数string2が見つからないとき 0
引数startの値が引数string1の文字数を超えるとき 0

一般的なVBAでは、文字列がNullになることは少ないので、Null値を返すことはないです。見つかったら1以上の数値を返し、見つからなかったら0を返す、と覚えておけばいいでしょう。

サンプル

次の例は、「ABCDE」の中から「D」を検索してその位置を表示します。

Sub Sample1()
    Dim String1 As String, String2 As String
    String1 = "ABCDE"
    String2 = "D"
    MsgBox InStr(String1, String2)
End Sub

所見

InStr関数は、とても役に立つ関数です。ただし、単独で使うことは希でしょう。上記サンプルのように、ただ文字の位置を調べて終わるという作業は、実務ではほとんどありません。文字の位置を調べて、それを元に次の処理を行うのが一般的です。たとえば、セルに「田中 亨」のようなデータが入力されていたとします。苗字と名前が半角スペースで区切られたデータです。こうしたデータを「半角スペースの前後に分割する」ときは、InStr関数で半角スペースの位置を取得します。

Sub Sample2()
    ''アクティブセルに「田中 亨」が入力されているとします
    ''アクティブセルの1つ右のセルに苗字を
    ''アクティブセルの2つ右のセルに名前を代入します
    Dim N As Long
    N = InStr(ActiveCell, " ")
    ActiveCell.Offset(0, 1) = Left(ActiveCell, N - 1)
    ActiveCell.Offset(0, 2) = Mid(ActiveCell, N + 1)
End Sub

上記のコードは、InStr関数の結果(半角スペースの位置)を一度変数Nに入れてから使っています。もちろん、次のように直接使うことも可能です。

Sub Sample3()
    ActiveCell.Offset(0, 1) = Left(ActiveCell, InStr(ActiveCell, " ") - 1)
    ActiveCell.Offset(0, 2) = Mid(ActiveCell, InStr(ActiveCell, " ") + 1)
End Sub

引数string2に2文字以上の文字列を指定したときは、先頭文字の位置を返します。

Sub Sample4()
    MsgBox InStr("ABCDE", "CD")     ''「3」を返します
End Sub

引数string1の中に、引数string2が複数存在するときは、最初に見つかった位置を返します。

Sub Sample5()
    MsgBox InStr("ABCABC", "C")     ''「3」を返します
End Sub

引数startを省略すると、文字列の先頭(1文字目)から探します。引数startを動的に変化させると、引数string1の中に、引数string2何個あるかを調べることができます。

Sub Sample6()
    Dim N As Long, cnt As Long, String1 As String, String2 As String
    String1 = "C:\Work\2010\Sub\Book1.xlsx"
    String2 = "\"
    N = InStr(1, String1, String2)
    Do While N > 0
        cnt = cnt + 1
        N = InStr(N + 1, String1, String2)
    Loop
    MsgBox String2 & " は、" & cnt & "個あります"
End Sub

InStr関数は、大文字と小文字を区別します。次のコードは、小文字の「abcd」から大文字の「C」を探しているので、見つからず0を返します。

Sub Sample7()
    MsgBox InStr("abcd", "C")       ''「0」を返します
End Sub

大文字と小文字を同一視して検索するには、引数string1と引数string2を、両方とも大文字または小文字に統一して比較します。

Sub Sample8()
    Dim String1 As String, String2 As String
    String1 = "C:\WORK\Book1.xlsx"
    String2 = "Work"
    MsgBox InStr(UCase(String1), UCase(String2))
End Sub

UCase関数は、引数の文字列を大文字に変換します。小文字に変換するときは、LCase関数を使います。

UCase関数の解説

LCase関数の解説