InstrRev関数で文字列の位置を末尾から調べる

今回の目標

「文字列を末尾から検索したい!」や「InStr関数とInstrRev関数は何が違うの?」と疑問を持ったあなたへ。
この記事では、InstrRev関数の使い方から、InStr関数の違いを、まとめて丁寧に解説します! 基本的なだけでなく、実務で使える具体例つきです。

目標リスト

  • InstrRev関数について、理解する
  • InStr関数とInstrRev関数の違いを理解する

InstrRev関数について

InstrRev関数とは

InstrRev関数は、⽂字列内で特定の⽂字列がどの位置にあるかを、末尾から数えて何番目にあるかを返します。 もし、調べたい文字が含まれていない場合は、『0』を返します。
文字「ABCABC」で、文字「A」をInstrRev関数を使用すると、「4」が返ります。
たとえば文字列『ABCABC』で、InstrRev関数を使って『A』を検索すると、『4』が返ります。

InstrRev関数の引数一覧と戻り値

InstrRev関数の構文

InstrRev(stringcheck, stringmatch, start, compare)

InstrRev関数の引数一覧

※一部、Microsoft社のリファレンスを参照しています。
 【Microsoft公式】 InStrRev 関数

名前省略規定値説明
stringcheck不可-何文字目から検索するか(検索開始位置)
stringmatch不可-検索する文字列(検索文字)
start可能-1検索対象の文字列(被検索文字)
compare可能vbBinaryCompare大文字・小文字、全角・半角が違っても置換をするか。規定値の場合、文字種が違うと、検索対象にならない。

引数「compare」の定数一覧です(実用的な定数のみ記載します)。

名前説明
vbBinaryCompare0大文字・小文字、全角・半角が異なる場合、検索対象としない
vbTextCompare1大文字・小文字、全角・半角が異なる場合、検索対象とする

使用サンプル

1.メールアドレスの「@」の位置を取得する

メールアドレスの「@」の位置を取得します。
今回は他関数との連携例として、「@」より前(ローカル部)及び、「@」より後ろ(ドメイン部)も取得します。 ローカル部はLeft関数、ドメイン部はMid関数で取得すると良いでしょう。

サンプルコード

Sub SampleInstrRev1()
    Dim mailAddress As String
    Dim mailLocal As String
    Dim mailDomain As String
    Dim sepPos As Long
    
    mailAddress = "hogefuga@example.com"
    
    ' @ 以降がドメイン部のため、@ が何文字目か取得する
    sepPos = InstrRev(mailAddress, "@")
    
    ' ローカル部を抽出する
    mailLocal = Left(mailAddress, sepPos - 1)
    ' ドメイン部を抽出する
    mailDomain = Mid(mailAddress, sepPos + 1)
    
    Debug.Print "メールアドレス:" & mailAddress
    Debug.Print "@ が何文字目か:" & sepPos
    Debug.Print "ローカル部  :" & mailLocal
    Debug.Print "ドメイン部  :" & mailDomain
End Sub
【実行結果】

メールアドレス:hogefuga@example.com
@ が何文字目か:9
ローカル部  :hogefuga
ドメイン部  :example.com

2.フルパスからファイル名を取得する

フルパスの中で、最後に現れるディレクトリ区切り文字(¥)の位置を探します。その位置より後ろの文字列がファイル名になりますので、Mid関数で取得しましょう。

サンプルコード

Sub SampleInstrRev2()
    Dim fullPath As String
    Dim sepPos As Long      'sep = separator(区切り)
    Dim fileName As String
    
    fullPath = "C:\Users\Yamada\Desktop\abc.txt"
    sepPos = InstrRev(fullPath, "\")
    fileName = Mid(fullPath, sepPos + 1)
    
    Debug.Print "ファイル名:" & fileName
End Sub
【実行結果】

ファイル名:abc.txt

3.ファイルの拡張子を取得する

ファイル名の中で、最後に現れる半角ドット(.)の位置を探します。その位置より後ろの文字列が拡張子です。Mid関数で取得しましょう。

サンプルコード

Sub SampleInstrRev3()
    Dim fullPath As String
    Dim sepPos As Long      ' sep = separator(区切り)
    Dim extName As String   ' ext = extension(拡張子)
    
    fullPath = "C:\Users\Yamada\Desktop\abc.txt"
    sepPos = InstrRev(fullPath, ".")
    extName = Mid(fullPath, sepPos + 1)
    
    Debug.Print "拡張子名:" & extName
End Sub
【実行結果】

拡張子名:txt

4.大文字小文字や、全角半角を区別せずに位置を取得する

InstrRev関数の第4引数は「何文字目から検索を開始するか」です。 InstrRev関数は文字列と検索する文字の大文字・小文字や全角・半角が異なると位置を取得できません。
しかし、第4引数に「vbTextCompare」を指定することで、大文字小文字および全角半角の違いを無視して、位置を取得できます。 なお、第4引数を指定する場合は、第3引数(何文字目から検索するか)を省略できません。 第3引数に Len関数 を使い、引数を検索対象の文字列を指定することで、末尾から検索できます。

サンプルコード

Sub SampleInstrRev4()
    Dim str As String
    Dim posBinaryCompare As Long
    Dim posTextCompare As Long
    
    str = "abcabc"
    posBinaryCompare = InstrRev(str, "B")
    posTextCompare = InstrRev(str, "B", Len(str), vbTextCompare)
    
    Debug.Print "posBinaryCompare:" & posBinaryCompare
    Debug.Print "posTextCompare:" & posTextCompare
End Sub
【実行結果】

posBinaryCompare:0
posTextCompare:5

5.2回目以降の特定の文字列の位置を取得する

InstrRev関数の第3引数は「何文字目から検索を開始するか」です。 例えば、文字「ABAB」から、文字「B」の2回目が何文字目にあるかを調べたい場合、1回目のBが何文字目にあるかを末尾から調べ、最初に見つかった位置の1つ前まで戻し、そこから再度検索することで、2回目の『B』の位置を取得できます。

サンプルコード

Sub SampleInstrRev5()
    Dim str As String
    Dim search As String
    Dim pos As Long
    
    search = "c"
    str = "abcabcabcabc"
    
    '1回目の位置
    pos = InstrRev(str, search)
    '2回目の位置
    pos = InstrRev(str, search, pos - 1)
    
    Debug.Print "2回目の 'c' の位置:" & pos & "文字目"
End Sub
【実行結果】

2回目の 'c' の位置:9文字目

InStr関数とInstrRev関数の違いと使い分け

機能などの違いについて

関数名について

関数名の表記に違いがあります。
InStr関数は『S』が大文字ですが、InstrRev関数は『s』が小文字です。

関数の機能の違いについて

先頭から検索する関数は、「InStr関数」です。
末尾から検索する関数は、本記事で紹介した「InstrRev関数」です。

引数の位置について

InStr関数と、InstrRev関数で引数のデータ自体は同じですが、順番が異なります。

  • InStr関数(何文字目から検索するか, 被検索文字, 検索文字, 比較種類)
  • InstrRev関数(被検索文字, 検索文字, 何文字目から検索するか, 比較種類)

上記の通り、「何文字目から検索するか(検索開始位置)」の位置が異なります。

InStr関数とInstrRev関数の使い分け

特定の文字が含まれているかどうかを確認するだけであれば、どちらの関数を使っても同じ結果になります。
それに対し、フルパスからファイル名を取得する、などの取得する位置が重要な場合は使い分けが必要です。

  • InStr関数
    ・外国人のファーストネームを取得する
     ※ ファーストネーム、ミドルネーム、ラストネームがあるときに有用
    ・電話番号の市外局番を取得する
  • InstrRev関数
    ・フルパスからファイル名を取得する
    ・拡張子を取得する

注意点(戻り値、InStr関数との動作の違い等)

InstrRev関数の注意点は以下の通りです。
赤の太字は、Instr関数と挙動が異なるので注意しましょう。

被検索文字について

  • 被検索文字が空文字("")の場合、『0』を返す
  • 被検索文字が「Null」の場合、実行時エラー94が発生する
    (リファレンスには「Null」を返すと記載されているので、環境によって異なる可能性有)
  • 被検索文字が「Nothing」の場合、実行時エラー91が発生する

検索文字について

  • 検索文字が空文字("")の場合、検索開始位置を返す
  • 検索文字が「Null」の場合、実行時エラー94が発生する。
    (リファレンスには「Null」を返すと記載があるので、環境によって異なる可能性有)
  • 検索文字が「Nothing」の場合、実行時エラー91が発生する

検索開始位置について

  • 検索開始位置が被検索文字の長さより長いと、『0』を返す。
    検索文字が空文字("")の場合でも、『0』を返す。
    ※ InStr関数は、検索文字が空文字("")の場合、検索開始位置を返す。
  • 検索開始位置が「-1」を除く「0」以下の場合、実行時エラー5が発生する。
    被検索文字や、検索文字が空文字("")の場合も、実行時エラー5が発生する。
    なお、検索開始位置を「-1」にすると、通常通り末尾から検索します(規定値が「-1」)。
  • 検索開始位置が小数の場合、CInt関数の丸めの変換が行われる。
    例)2.50 → 2、 2.51 → 3、 3.5 → 4、 4.5 → 4

発生する可能性があるエラーについて

実行時エラー5
プロシージャの呼び出し、または引数が不正です。

実行時エラー91
オブジェクト変数または With ブロック変数が設定されていません。

実行時エラー94
Null の使い方が不正です。

関連リンク

ページの先頭へ