構文
引数 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関数を使います。