Excel VBAの「InStrRev関数」について解説します。
InStrRev関数とは
Excel VBA の InStrRev関数とは、対象文字列内に指定文字列が存在するかを後ろから検索し最初に見つかった位置を返します。返される位置は先頭から数えた位置です。
文字列の先頭から検索する InStr関数とは逆方向の検索です。その違いについても見ていきましょう。
InStrRev関数(Visual Basic for Applications リファレンス)
構文(引数と戻り値)
Excel VBAの関数を使いこなすには、関数の構文を正しく理解しておくことが重要です。
構文
InStrRev(stringcheck, stringmatch [,start [,compare]])
※ [ ] 内の引数は省略可能であることを表しています。
※ 文字列の先頭から検索する InStr関数とは start の位置が違うので注意してください。
引数と戻り値
InStrRev関数の引数は次のとおりです。
引数 | 説明 |
---|---|
stringcheck | 【必須】検索元となる文字列を指定します。 |
stringmatch | 【必須】検索する文字列を指定します。 |
start | [省略可能] 検索開始位置を指定します。省略時は -1 です。 ※ start に Null が含まれる場合エラーになります ※「-1」が最後の文字位置という意味です ※ 数値は先頭から数えた文字数で指定します |
compare | [省略可能] 比較するモードを指定します。 compare を指定する場合は、start の指定が必須です。 省略時の規定はバイナリモードです。 |
InStrRev関数の戻り値は次のとおりです。
設定条件 | InStr が戻す値 |
---|---|
stringmatch が stringcheck 内に存在する場合 | 最初に見つかった位置 |
stringcheck が stringmatch 内にない場合 | 0 |
stringcheck の長さが 0 の場合 | 0 |
stringcheck が Null の場合 | Null |
stringmatch の長さが 0 の場合 | start(未指定の場合 -1 ) |
stringmatch が Null の場合 | Null |
start > stringcheckの文字数 の場合 | 0 |
※ start の位置から先頭に向かって検索していきます。
[compare] 比較モード
定数 | 値 | 説明 |
---|---|---|
vbBinaryCompare | 0 | バイナリモードで比較します。省略時はこのモードです。 大/小文字、全/半角、ひらがな/カタカナを区別します。 |
vbTextCompare | 1 | テキストモードで比較します。 大/小文字、全/半角、ひらがな/カタカナを区別しません。 |
※ vbUseCompareOption(-1)と vbDatabaseCompare(2)という設定もありますが、まず使用することは無いと思いますので説明を省略しています。
解説
★ InStrRev で必須な引数(stringmatch と stringcheck)だけ指定した場合の動作は次とおりです。
- 検査対象の文字列(stringmatch)を後ろから前方に向かって検査します。
- 検索は、大/小文字、全/半角、ひらがな/カタカナを区別するバイナリモードです。
- 検査指定文字列(stringcheck)が最初に見つかった(先頭からの)位置を返します。
- 見つからなかった場合 0 を返します。
★ InStrRev で引数(start と compare)を指定した場合の動作は次とおりです。
- 検査対象の文字列(stringmatch)を指定(start)位置から先頭に向かって検査します。
- 検索モードは引数(compare)の指定に従います。省略時はバイナリモードです。
- バイナリモードは、大/小文字、全/半角、ひらがな/カタカナを区別します。
- テキストモードでは区別しないで検索します。
- 検査指定文字列(stringcheck)が最初に見つかった位置の数値を返します。
- 見つかった位置の数値は開始位置からの数値ではなく、先頭からの数値です。
- 見つからなかった場合 0 を返します。
見つかった場合1以上の数値、無かった場合0を返すということです。
使用例
InStr関数の解説で使った使用例を、InStrRev関数に置き換えてみる方法がわかりやすいと思いますのでやってみます。
省略できる引数を指定しない単純な例がこちらです。
Sub InStrRev_test1()
Dim strCheck As String
Dim strMatch As String
strCheck = "アイウエオアイウエオ"
strMatch = "ア"
Debug.Print InStrRev(strCheck, strMatch) ' 1 を返します
End Sub
引数を省略した場合、実際には最後尾から検索(-1) と vbBinaryCompare(0) が指定されているのと同じです。
バイナリモードで最後尾から検索した結果、先頭からの位置の「1」が返ってきました。
これは、バイナリモードなので位置「6」の「ア」を読み飛ばしている結果ですね。
次に、検索モードの引数を vbTextCompare(1) で指定した場合の例です。開始位置は空欄で省略しているので「-1」が指定されているのと同じです。
Sub InStrRev_test2()
Dim strCheck As String
Dim strMatch As String
strCheck = "アイウエオアイウエオ"
strMatch = "ア"
Debug.Print InStrRev(strCheck, strMatch, , vbTextCompare) ' 6 を返します
End Sub
テキストモードの場合、文字種(大文字/小文字や全角/半角など)を区別しないので、小文字で指定しても大文字にヒットしてしまうので、返される位置は「6」です。
では、同じテキストモードで開始位置を「5」に指定した場合の例を見てみましょう。
Sub InStrRev_test3()
Dim strCheck As String
Dim strMatch As String
strCheck = "アイウエオアイウエオ"
strMatch = "ア"
Debug.Print InStrRev(strCheck, strMatch, 5, 1) ' 1 を返します
End Sub
5番目の位置から前方に検索していくので、小文字の「ア」の部分でヒットしました。返された値は「1」です。これは、開始位置からの値ではなく、文字列の先頭からの位置の値になってる点に注意しましょう。
文字列の位置を複数検索する
検索対象の文字列が複数存在する場合、連続で検索する一例です。
InStr関数の解説で使った使用例との違いは、11行目で対象文字列の文字数を取得して引数に使っている点です。後ろから検索するので開始位置を減らしていくようにしています。
Sub InStrRev_test4()
Dim strCheck As String
Dim strMatch As String
Dim arr() As String
Dim i As Long
strCheck = "あすのあさはあめ"
strMatch = "あ"
ReDim Preserve arr(0) '配列初期化
i = Len(strCheck) + 1 '文字列数 + 1
i = InStrRev(strCheck, strMatch, i - 1) '初期検索
If i >= 1 And arr(0) = "" Then arr(0) = i '配列に代入
Do While i > 1 '0 の場合Loopしない
i = InStrRev(strCheck, strMatch, i - 1) '以降の検索
If i > 0 Then '0なら代入しない
ReDim Preserve arr(UBound(arr) + 1)
arr(UBound(arr)) = i
End If
Loop
If arr(0) = "" Then '配列を判定して分岐
MsgBox "「" & strMatch & "」はありません"
Else
i = UBound(arr) - LBound(arr) + 1 '要素数
MsgBox "「" & strMatch & "」は " & i & "個あります" & _
vbCrLf & "位置は「" & Join(arr, ",") & "」です"
End If
End Sub
実行結果のMsgBox画像がこちらです。
Do While…Loopを使って、ヒットした位置の一つ前から再検索していくという設定です。
取得した位置の値は配列に格納して保存し、要素数と Join関数で書き出し表示しています。
おわりに
VBAの関数一覧はこちらです。
VBAサンプルファイルダウンロードページのご案内
このページで使用したサンプルファイルの登録はありません(^^;
ページ内のコードをコピーしてご利用ください。
ダウンロードページへトップリンクは下のカードクリックでジャンプできます。
よろしければご利用ください!
Excel VBA「InStrRev関数」で対象文字列の中に指定の文字列が存在しているかを後方から検索し、発見した場合にその位置を返す方法について解説しました。
「InStrRev関数」は「InStr関数」と同様に、対象文字列の中に存在する検索文字列の位置を返してくれます。どちらも見つからなかった場合は「0」が返ります。
違う点は、検索方向が「InStrRev関数」の場合は名前のとおり後ろ(逆)から行う点です。結果については、どちらも戻り値は先頭からの位置を返します。
見つかった位置の数値は、対象文字列に対して何らかの処理を行う際に使用します。
例えば、文字列を分割したり、削除したり、何か(例えば「-」や「/」)を挿入したりなどです。
文字列を操作する関数の中でも、比較的使用頻度の高い関数です。
使い方をしっかり覚えておくようにしましょう。
解説は以上です。少しでもみなさまのお役に立てたなら幸いです(^^;