InStr、InStrRev
InStr関数とInStrRev関数は、ある文字列の中に指定した文字列が存在する位置を内部処理形式LongのVariantの値で返します。
存在する場合は左端の先頭を1として何文字目にあるかを返します。
存在しない場合は0を返します。
InStr関数とInStrRev関数の違い
InStr関数とInStrRev関数の違いは、左から検索するか、右から検索するかの違いです。
例えば、” abc abc “という半角スペースを含む9文字の文字列がある場合、”abc”をInStr関数で検索した場合は左から2番目にあるため2を返し、”abc”をInStrRev関数は右から検索して先に見つかる”abc”の位置である6番目の6を返します。
検索の方向が違うだけで、見つかった位置を「左から何番目か」と判定するのはInStr関数もInStrRev関数も同じです。
構文
InStr関数
1 2 3 4 5 |
Function InStr( [Start], [String1], [String2], [Compare As VbCompareMethod = vbBinaryCompare]) |
Start | 検索を開始する文字位置を指定します。
左端である先頭は1になります。 省略時は先頭から検索されます。 引数Compareを指定した場合は省略できません。 |
|||||||||
String1 | 検索される側の文字列を指定します。 | |||||||||
String2 | 引数String1から検索したい文字列を指定します。
ワイルドカードは指定できません。 |
|||||||||
Compare | 検索する際の比較モードをVbCompareMethod列挙型で指定します。
VbCompareMethod列挙型
省略時はvbBinaryCompare(バイナリモード)になります。 設定時は引数Startは省略できません。 |
InStrRev関数
1 2 3 4 5 |
Function InStrRev( StringCheck As String, StringMatch As String, [Start As Long = -1], [Compare As VbCompareMethod = vbBinaryCompare]) As Long |
StringCheck | 検索される側の文字列を指定します。 |
StringMatch | 引数String1から検索したい文字列を指定します。
ワイルドカードは指定できません。 |
Start | 検索を開始する文字位置を指定します。
左端である先頭は1になります。 省略時は末尾(右端)から検索されます。 引数Compareを指定した場合は省略できません。 |
Compare | 検索する際の比較モードをVbCompareMethod列挙型で指定します。
省略時はvbBinaryCompare(バイナリモード)になります。 設定時は引数Startは省略できません。 |
InStr関数とInStrRev関数は引数の並びが異なります。
個人的には同じにしておけばいいのに、と思いますが仕方ありません。
戻り値
InStr関数とInStrRev関数の戻り値は引数の内容や検索結果によって以下のようになります。
検索結果 | 戻り値 |
---|---|
存在する場合 | 見つかった文字列の左端の位置を返す |
存在しない場合 | 0を返す |
String1、StringCheckが空文字列の場合 | 0を返す |
String2、StringMatchが空文字列の場合 | 引数Startの値 |
StartがString1、StringCheckの文字数より大きい場合 | 0を返す |
サンプルコード
文字列” abc abc “から”abc”をInStr関数とInStrRev関数で検索した場合のサンプルです。
InStr関数の場合は左側の” abc abc “が検索され、先頭の”a”が2番目であるため2を返します。
InStrRev関数の場合は右側の” abc abc “が検索され、先頭の”a”が6番目にあるため6を返します。
1 2 3 4 5 6 7 8 9 10 11 12 |
Sub InStrTest() Dim s Dim ret s = " abc abc " ret = InStr(s, "abc") Debug.Print ret '// 2 ret = InStrRev(s, "abc") Debug.Print ret '// 6 End Sub |