InStrRev関数がうまくいかない時は戻り値を確認
特定の文字列を後ろから(文末から)検索してくれるInStrRev関数。
私は「インストリングリバース」、「インストリバース」という呼び方を使っています。
この関数は他の関数と合わせてうまく使うと特定文字以降の文字列を抽出する事が出来ます。
加えて文字列の後方から特定文字を探すので先頭からみて2番目の特定文字を認識する事も出来ます。
簡単に使えてとても便利な関数のはずですが実はクセがあり使いにくい関数です。
- そもそもこの関数はどうやって使うのか?
- InStrRev関数を使ってみたが思っていた結果が返ってこない(値がおかしい)
- InStr関数と戻り値が同じ
私自身最初にInStrRev関数を使用した時にはこのような印象を持ちました。
この関数は戻り値が分かりにくいです。
加えて他の関数と合わせて使う事が多いので実際に使う時は難しく感じます。
関数を使いこなすにはこのポイントをおさえましょう。
- 検索は文末から
- 戻り値は文頭から
- 他の関数と組み合わせて使う
Enjoy Excel
以降でしっかり解説していきます。
関連記事
今回使用するLen関数について解説しています。
複数のかっこの中から文字列を取り出す時に活躍するコードを紹介しています。
InstrRev関数とは
まずは使い方です。
定義はこちらになります。MicrosoftさんのURLより引用しています。
ある文字列の中から別の文字列を後方から検索し、最初に見つかったその文字位置を返します。
Microsoft_InstrRev関数
文字列の中から特定の文字を探すという事はなんとなく分かります。
例えば「あいうえお」という文字列の文末から「え」を探して文字位置を返すという関数です。
特に難しい事は書いていません。しかし戻り値のポイントが省略されています。
戻り値については後ほどしっかり解説しますのでひとまず次に進みます。
関数の構造
次は基本的な関数の構造について考えていきます。
As Long という事で戻り値は数値です。
それぞれの引数の説明です。1番の文字列と2番の特定文字は必須です。
番号 | 引数 | 説明 |
---|---|---|
1 | 文字列 | 検索元となる文字列です。 |
2 | 特定文字 | 検索対象となる文字です。 |
3 | 開始位置 | 検索開始位置です。省略すると「文末」からの検索になります。 |
4 | 比較方法 | 全角半角を区別 する/しない など比較の方法を選択できます。 |
比較方法のパラメータも提示しておきます。
番号 | 定数 | 値 | 説明 |
---|---|---|---|
1 | vbBinaryCompare | 0 | ひらがなとカタカナ、全角半角、大文字小文字を区別してくれます。 |
2 | vbTextCompare | 1 | ひらがなとカタカナ、全角半角、大文字小文字は区別されません。 |
vbDatabaseCompareはAccessで使う定数の様ですのでここでは省略しています。
戻り値に特徴があります
続いてに戻り値について解説します。
定義は紹介していますが実は少し足りないです。戻り値を使ってもう少し具体的に説明します。
ある文字列の文末から特定文字を検索します。
最初に見つかった特定文字が文頭からみてどこに居るのかを確認し文字数を返します。
「InStrRev関数を使って思っていた結果が返ってこない」という方は多くの場合ここが抜けています。
返ってくる文字数はあくまで文頭から数えた文字数だという事を忘れない様にしてください。
文末から文字を検索して文末から数えた文字数を返してくれる方が分かり易いのですが変化球が来ます。
感覚としては「戻り値が思った値と違う」となります。ご注意ください。
エラー回避を・・・と考える前に正しい関数の戻り値を確認しましょう。
以降で実際のコードを使ってInStrRev関数の使い方を解説します。
使い方
InStr関数とInStrRev関数を一緒に紹介します。
理由は数値を比較する事で違いを見る事が出来る為です。
最後にRight関数とLen関数、InStrRev関数を使い特定文字から後ろの文字列を抽出する方法を紹介します。
ワークシート
ワークシートの値は1つです。今回の特定文字は 「-」 です。
最終的には文末の12を抽出します。
コード
続いてコードです。
Sub InStrRev関数の使い方1()
Dim a As Long 'InStr関数の戻り値を代入
Dim b As Long 'InStrRev関数の戻り値を代入
Dim c As String '特定文字以降の文字列を代入
'InStr関数は文字列を文頭から数えて特定文字を探します。
'その後文頭から数えた文字位置を返します。
a = InStr(Range("C3"), "-")
'InStrRev関数は文字列を文末から数えて特定文字を探します。
'その後文頭から数えた文字位置を返します。
b = InStrRev(Range("C3"), "-")
'特定文字以降の文字列を変数cに代入しています。
'Len関数で文字列の全文字数を数えます。
'そこから変数bの値を引く事で特定文字の後ろの文字列を抽出しています。
c = Right(Range("C3"), Len(Range("C3")) - b)
End Sub
コードの解説
コードは3本です。
9行目のInstr関数は単体で機能しています。
18行目のコードは13行目のコードから取得された戻り値を使っています。
InStr関数
9行目のコードです。InStr関数を使います。ここでは必須の引数のみ紹介しておきます。
String1に文字列、String2に検索対象の文字をとります。
InStr関数は文字列を文頭から数えて特定文字を探します。
その後文頭から数えた文字位置を返します。
具体的に書くと4の後ろの 「-」 を数えて文字位置を返します。変数aには18が入ります。
InStrRev関数
13行目のコードです。InStrRev関数は文字列を文末から数えて特定文字を探します。
その後文頭から数えた文字位置を返します。
ポイントで紹介した箇所です。文字列を数えるのは文末からです。続いて戻り値は文頭からです。
よって変数bには20が入ります。
InStr関数と並行して使う事で「-」という同じ特定文字でも取得する文字位置が違う事が分かります。
特定文字以降の文字列を抽出
18行目のコードです。Right関数とLen関数とInStrRev関数を一緒に使います。
Right関数はワークシート関数にもありますね。2つの引数共に必須です。
文字列の文末(右側)から指定した文字数分だけ文字列を取り出す関数です。
番号 | 引数 | 説明 |
---|---|---|
1 | 文字列 | 文字を抽出するための文字列 |
2 | 文字数 | 抽出する文字数 |
この関数がベースになります。Lengthの位置でLen関数とInStrRev関数を使います。
Right関数を読み解く
Len関数は文字列全部の文字数を数えるのでここでは22を返します。
この22から変数bに格納したInStrRev関数の戻り値20を引くのでRignt関数のLengthは2になります。
最後的にはRight関数で指定した文字列の文末から2文字を返してという指示になります。
よって変数cには12という文字列が返ります。
取得する文字列に応じて変数を決める
今回は住所の中から末尾にある番地を取得しています。
よって数値であることが多いので変数の宣言時はLongでも良いですね。
InStr関数とInStrRev関数の戻り値が同じ
このような事例の時はInStr関数もInStrRev関数も戻り値が同じになります。
変数a、b共に10が代入されることになります。
Sub InStrRev関数の使い方2()
Dim a As Long 'InStr関数の戻り値を代入
Dim b As Long 'InStrRev関数の戻り値を代入
a = InStr(Range("C3"), "区")
b = InStrRev(Range("C3"), "区")
End Sub
2つの関数は特定文字を数える起点は違いますが結局文頭からの文字数を返す為結果は同じになります。
InStrRev関数は最終的には文頭から数えた文字数を返す事が分かってないと悩んでしまいます。
「戻り値は文末から数えた13が返ってこないとおかしい・・・」と考えてしまう為です。
度々書きますがあくまで戻り値は文頭から数えた文字数が返るという事を覚えておいてください。
まとめ
InStrRev関数は簡単そうですが奥が深い関数です。
文字列の状況や特定文字の数などを総合的に考えて関数を組み合わせて使う事が要求されます。
反復作業で理屈を身に付けてください。
文字列関連の関連記事を紹介しておきます。
合わせて記事を見ていただくと文字列の扱いについて出来る事が増えて世界が広がります。