大体でIT

-ちょっと使えるネタを紹介-

大体でIT

Excel VBAで文字列を後ろから検索する方法をご紹介します。後ろから文字列の位置を検索するのは、VBA関数のInStrRevを使えばできます。InStrRevの基本的な使い方と使う場面について説明します。

はじめに

この記事では、後ろから文字列の位置を検索するInStrRevをご紹介します。

InStrRevの基本的な動きはInStrと同じです。

後ろから文字列を検索する場面としては、同じ文字列が複数含まれている文字列から右側の文字列を切り出したい場合に使えます。

例えば、『千葉県市川市1丁目-2-3』から番地を切り出したい場合ですね。『市』が二つあります。

文字列の操作はいろいろなアプローチがあります。

場面に応じて使うVBA関数を変えることができると、VBAコードがシンプルになって可読性を上げることができます。

この記事で紹介すること

  • 文字列の位置を後ろから検索する方法

目次

VBA関数InStrRevで文字列を後ろから検索

文字列を後ろから検索したい場合は、VBA関数のInStrRevでできます。

文字列を前から検索するInStrの後ろから検索するバージョンです。

後ろから文字列を検索してみる

後ろから検索するイメージはこんな感じです。

文字列『あいうえお』から『い』の位置を検索してみます。

InStrRevで後ろから検索するイメージ

InStrRevを使って文字列を後ろから検索するイメージ

結果は『4』文字目となります。

右の方が1文字目となっているので、『あいうえお』で『い』は後ろから『4』文字目ということになります。

VBAコードでは次のように記載します。

Sub TEST1()
    
    a = "あいうえお"
    
    '後ろから『い』の位置を検索
    b = InStrRev(a, "い")
      
End Sub

変数の入力は、『位置 = InStrRev(元文字列, 検索文字列)』となります。

実行した結果です。

文字列を後ろから検索した結果

InStrRevを使って文字列を後ろから検索した結果

結果は『4』文字目となります。

文字列『あいうえお』の後ろから検索できています。

検索文字列がない場合は0

検索文字列がない場合は、『0』となります。

文字列『あいうえお』から『か』を検索したときのイメージです。

InStrRevで検索文字がなかった場合のイメージ

InStrRevで文字列を検索して検索文字がなかった場合のイメージ

結果は『0』となります。

VBAコードを記載してやってみます。

Sub TEST2()
    
    a = "あいうえお"
    
    '後ろから『か』の位置を検索
    b = InStrRev(a, "か")
    
End Sub

実行した結果です。

InStrRevで検索文字列がない場合の結果

InStrRevで検索文字列がない場合の結果

結果は、『0』となります。

以上がInStrRevの基本的な操作です。

文字列を後ろから検索する場面

文字列を後ろから検索する場面についていくつかご紹介します。

任意の文字列の位置を検索して文字列を切り出したい場合で、同じ文字列がある場合にInStrRevが使えるかと思います。

言葉だけではちょっとわかりづらいので具体例を挙げてみます。

住所を分ける場合

例えば次のような住所の番地の部分を切り出したい場合です。

  • 千葉県1丁目-2-3
  • 石川県野々市市1丁目-2-3
  • 三重県四日市市1丁目-2-3

『市』が複数含まれています。

これらの住所から番地を取得したい場合、InStrでは少し不都合が生じます。

この場合に、InStrRevを使うと簡単に番地を取得することができます。

『千葉県市川市1丁目-2-3』で住所と番地を分けてみます。

VBAコードです。

Sub TEST3()
    
    With ActiveSheet
        
        'セルの値を取得
        a = .Cells(1, 1)
        
        '後ろから『市』の位置を検索
        b = InStrRev(a, "市")
        
        .Cells(1, 2) = Left(a, b) '『市』の左側を取得
        .Cells(1, 3) = Mid(a, b + 1) '『市』の右側を取得
    
    End With
    
End Sub

手順は次のようになります。

  • ①後ろから『市』の位置を取得
  • ②取得した位置から住所と番地を分ける

というような感じです。

では実行した結果です。

住所と番地に分けた結果

InStrRevを使って住所と番地にわける

『千葉県市川市1丁目-2-3』から『千葉県市川市』と『1丁目-2-3』に分けることができました。

複数の『-』で文字列が分けられている

複数の『-』で文字列が区切られている場合で、右側の文字列を切り出す場合にも使えます。

次のような文字列です。

  • 123-456-789
  • 1-2-3456789
  • 1234-567-89

このように『-』が二つある文字列で、右側数字を切り出したい場合です。

文字列『-』の位置は不特定で決まりがないとします。

こちらもInStrでは不便です。

後ろから文字列の位置を検索できる『InStrRev』だと簡単に右側の文字列を切り出せます。

文字列『123-456-789』から『789』を切り出してみます。

Sub TEST4()
    
    a = "123-456-789"
    
    '後ろから『-』の位置を検索
    b = InStrRev(a, "-")
    
    '『-』の右側を取得
    c = Mid(a, b + 1)
    
End Sub

手順は次のようになります。

  • ①右側から『-』の位置をInStrRevで取得
  • ②取得した『-』の位置を基に右側の文字列を切り出す

では実行してみます。

右側の文字列を切り出した結果

InStrRevで右側の文字列を切り出した結果

文字列『123-456-789』から『789』が切り出せました。

InStrRevを使うと右側の文字列切り出しが楽になります。

複数の半角スペースで分けられている

先ほどと同じですが、半角スペースで文字列が分けられていて、右側の文字列を切り出したい場合にも、InStrRevが使えます。

このような文字列です。

  • 123 456 789
  • 1 2 3456789
  • 1234 567 89

文字列『1 2 3456789』から右側の文字列『3456789』を切り出すVBAコードです。

Sub TEST5()
    
    a = "1 2 3456789"
    
    '後ろから半角スペースの位置を検索
    b = InStrRev(a, " ")
    
    '半角スペースの右側を取得
    c = Mid(a, b + 1)
    
End Sub

手順は、先ほどと同じでこのようになります。

  • ①右側から半角スペースの位置をInStrRevで取得
  • ②取得した半角スペースの位置を基に右側の文字列を切り出す

では実行してみます。

右側の文字列を切り出した結果

InStrRevで右側から文字列を切り出し

文字列『1 2 3456789』から『3456789』を切り出せました。

VBA関数InStrRevの注意点

後ろから文字列を検索するInStrRevは大文字と小文字を区別します。

大文字と小文字は区別される

文字列『ABC』で『a』を検索してみます。

Sub TEST6()
    
    a = "ABC"
    
    '『ABC』に『a』が含まれる場合
    If InStrRev(a, "a") > 0 Then
        MsgBox "文字列に含まれています"
    '含まれない場合
    Else
        MsgBox "文字列に含まれていません"
    End If
    
End Sub

実行してみます。

『ABC』から『a』を検索した結果

大文字から小文字をInStrRevで検索してみる

元文字列『ABC』に検索文字列『a』は含まれないことになります。

解決策(vbTextCompare)

大文字と小文字を区別しないで検索したい場合は、引数に『vbTextCompare』を入れると解決できます。

次のようにVBAコードを入力します。

Sub TEST7()
    
    a = "ABC"
    
    '『ABC』に『a』が含まれる場合(大文字と小文字の区別なし)
    If InStrRev(a, "a", 1, vbTextCompare) > 0 Then
        MsgBox "文字列に含まれています"
    '含まれない場合
    Else
        MsgBox "文字列に含まれていません"
    End If
    
End Sub

変数の入力は、『位置 = InStrRev(元文字列, 検索文字列, 開始位置, vbTextCompare)』となります。

大文字と小文字を区別しないで検索したい場合は、3番目の引数に『開始位置』を入力して、4番目の引数に『vbTextCompare』を入力します。

3番目の引数『開始位置』も入力する必要がありますので、注意です。

では実行してみます。

大文字と小文字を区別しないで検索した結果

大文字から小文字を検索した結果

結果は、文字列『ABC』に『a』は含まれるという結果となりました。

大文字と小文字を区別しないで検索したい場合は『vbTextCompare』を覚えておくといいです。

おわりに

この記事では、後ろから文字列の位置を検索するInStrRevをご紹介しました。

InStrRevの基本的な動きはInStrと同じです。

右から文字列を検索する場面としては、同じ文字列が複数含まれている文字列から右側の文字列を切り出したい場合に使えます。

例えば、『千葉県市川市1丁目-2-3』から番地を切り出したい場合ですね。『市』が二つあります。

文字列の操作はいろいろなアプローチがあります。

場面に応じて使うVBA関数を変えると、VBAコードがシンプルになって可読性を上げることができます。

参考になればと思います。最後までご覧くださいましてありがとうございました。

関連する記事から探す

カテゴリから探す

カテゴリから見たい項目を探すと便利ですよ。

アーカイブから探す