大体でIT

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

大体でIT

Excel VBAで特定の文字列を含むかを検索して判定する方法についてご紹介します。VBA関数のInStrを使えば文字列を含むかの判定ができます。さらにInStrを応用すると、文字列の位置を取得して氏名の分割や、カッコ内の文字列を切り出したりすることができます。

はじめに

この記事では、文字列を検索するInStrについてご紹介します。

文字列が含むかを判定するには、InStrの返り値が0より大きいかどうかで、判定することができます。

文字列を含む位置を使って氏名を分けたり、カッコ内の文字列を切り出したり、応用することもできます。

この記事で紹介すること

  • 特定の文字列を含むか判定する
  • 検索した文字列の位置を使って文字列を切り出す

目次

VBA関数InStrは文字列を検索して位置を返す

文字列を検索したい場合は、VBA関数のInStrを使うとできます。

元の文字列の中から一致した文字列の位置を返すのがInStrです。

文字列を検索してみる

文字列の中から1文字を検索する場合、InStrは次のような検索イメージになります。

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

文字列を検索するイメージ

文字列を検索するイメージ

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

ポイントは、一致した文字列の位置を返すということです。

文字列『あいうえお』で『う』は左から3文字目なので『3』を返します。

VBAコードで記載すると次のようになります。

Sub TEST1()
    
    a = "あいうえお"
    
    b = InStr(a, "う") '『う』の位置を取得
    
    MsgBox b
    
End Sub

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

では実行してみます。

文字列を検索した結果

InStrで文字列を検索した結果

結果は『3』文字目となりました。

検索文字がない場合は0

検索文字がない場合、InStrは『0』を返します。

検索文字がない場合のイメージです。

文字列に検索文字がない場合のイメージ

文字列に検索文字がない場合のイメージ

やってみます。

Sub TEST2()
    
    a = "あいうえお"
    
    b = InStr(a, "か") '『か』の位置を取得 ⇒ 0になります。
    
    MsgBox b
    
End Sub

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

検索文字がない場合

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

文字列『あいうえお』に『か』は含まれないので結果は『0』となります。

VBA関数InStrで特定の文字列を含むかを判定する

InStrで特定の文字列を含むかを判定する方法についてご紹介します。

判定に使うのは文字列をInStrで検索したときに取得できる位置を使います。

文字列を検索して、文字列を含む場合は、0より大きい値を返します。

反対に、文字列を含まない場合は、0を返します。

これを利用します。

特定の文字列を含む場合

特定の文字列を含む場合、InStrで取得できる値は必ず0より大きい値となります。

なので、特定の文字列を含む場合という条件のVBAコードは次のようになります。

Sub TEST3()
    
    a = "あいうえお"
    
    '文字列に『う』が含まれているか
    If InStr(a, "う") > 0 Then
        MsgBox "文字列に含まれています"
    End If
    
End Sub

文字列『あいうえお』に『う』が含まれている場合は、メッセージを表示する。というVBAコードとなっています。

では実行してみます。

特定の文字列を含む場合の条件を実行した結果

メッセージが表示されました。

期待していた通り、文字列『あいうえお』は『う』の文字列を含むという結果となります。

特定の文字列を含まない場合

特定の文字列を含まない場合、InStrで取得する値は必ず0となります。

なので、特定の文字列を含まない場合という条件のVBAコードは次のようになります。

Sub TEST4()
    
    a = "あいうえお"
    
    '文字列に『か』が含まれていないか
    If InStr(a, "か") = 0 Then
        MsgBox "文字列に含まれていません"
    End If
    
End Sub

文字列『あいうえお』に『か』が含まれていない場合は、メッセージを表示する。というVBAコードとなっています。

では実行してみます。

特定の文字列を含まない場合の条件を実行した結果

メッセージが表示されました。

期待していた通り、文字列『あいうえお』は『か』の文字列を含まないという結果になります。

特定の文字列を含むかの判定はInStrの返り値が0より大きいか、0かで判定することができます。

結構使うVBAコードです。

VBA関数InStrの注意点

特定の文字列をInStrで含むかを判定する場合、大文字と小文字は区別されます。

『A』と『a』は別ものということですね。

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

大文字を小文字で検索してみます。

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

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

実行してみます。

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

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

含まれないのメッセージが表示されました。

文字列『ABC』の中に『a』は、存在しないということになります。

解決策:すべて大文字に変換

解決策です。

検索される文字列と検索する文字列を『Ucase』を使ってすべて大文字にしてInStrで検索する。という方法です。小文字に変換でもできます。

大文字と小文字を区別したくないという場合に使えます。

イメージとしては次のようになります。

すべて大文字に変換して検索

すべて大文字に変換して検索するイメージ

すべて大文字にすれば、大文字と小文字の区別なく文字列を検索できます。

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

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

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

文字列と検索文字を『Ucase(文字列)』を使ってすべて大文字に統一しています。

実行してみます。

実行結果

UCaseで大文字に変換して検索した結果

文字列を含むというメッセージとなりました。

大文字と小文字の区別なく検索できていることがわかります。

検索した文字列の位置を使って文字列を操作

もう一つのInStrの使い方として、検索した文字列の位置を使って文字列を操作する。というのがあります。

その例を、2つご紹介します。

氏名を分ける

氏と名を分けたい場合に『InStr』は使えます。

例えば『鈴木 一郎』を『鈴木』と『一郎』に分けたい場合です。

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

氏名を分ける手順

  • 全角スペースの位置をInStrで探す
  • 全角スペースの前を切り出す(氏)
  • 全角スペースの後を切り出す(名)

というような流れになります。

Sub TEST7()
    
    With ActiveSheet
        '全角スペースの位置を取得
        a = InStr(.Cells(1, 1), " ")
        
        '全角スペースの前を切り出し
        .Cells(1, 2) = Left(.Cells(1, 1), a - 1)
        
        '全角スペースの後を切り出し
        .Cells(1, 3) = Mid(.Cells(1, 1), a + 1)
    End With
    
End Sub

全角スペースの位置を探すのが、InStrです。

全角スペースの前を切り出すのが、Leftです。

全角スペースの後を切り出すのが、Midです。

では実行してみます。

実行結果

InStrを使って氏名分けた結果

『鈴木 一郎』を『鈴木』と『一郎』に分けることができました。

カッコ内の文字列を切り出し

カッコ内の文字列を切り出す場合にもInStrが使えます。

例えば、『123(456)789』のカッコ内の『456』を切り出したいといった場合です。

このような手順になります。

手順

  • "("の位置をInStrで探す
  • ")"の位置をInStrで探す
  • カッコ内の文字列をMidで切り出す

というような流れになります。

文字列『123(456)789』からカッコ内の『456』を切り出してみます。

Sub TEST8()
    
    a = "123(456)789"
    
    b = InStr(a, "(") '『(』の位置を取得
    c = InStr(a, ")") '『)』の位置を取得
    
    'カッコの中を切り出し
    c = Mid(a, b + 1, c - b - 1)
    
    MsgBox c
    
End Sub

では実行してみます。

実行結果

カッコ内の文字列を切り出した結果

結果は『456』となりました。

文字列『123(456)789』のカッコ内の文字列を取得することができました。

おわりに

この記事では、文字列を検索するInStrについてご紹介しました。

文字列があるかを判断するには、InStrの返り値が0より大きいかどうかで、文字列を含むかを判定することができます。

文字列を含む位置を使って氏名を分けたり、カッコ内の文字列を切り出したり、応用することもできます。

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

関連する記事から探す

カテゴリから探す

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

アーカイブから探す