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」の定数一覧です(実用的な定数のみ記載します)。
名前 | 値 | 説明 |
---|---|---|
vbBinaryCompare | 0 | 大文字・小文字、全角・半角が異なる場合、検索対象としない |
vbTextCompare | 1 | 大文字・小文字、全角・半角が異なる場合、検索対象とする |
使用サンプル
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 の使い方が不正です。