ラピードアクト株式会社

技術記事:ExcelVBAで仕事を効率化しようVol.17

みなさん、こんにちは。
ITソリューション事業部の林です。

本記事では、ExcelVBAのテクニックを紹介・解説いたします。

今回紹介するのは、「特定の文字列を含む/含まないの判定方法」です。

【目次】

  1. 特定の文字列を含むか判定する方法
  2. 関数の構文と戻り値
  3. 使用例
  4. 終わりに

それでは、始めましょう!

特定の文字列を含むか判定する方法

この判定は、具体的にいうと「文字列の中に特定の単語が含まれているか」を確認する手段になります。
ExcelVBAにおいては、「Instr」と「Instrrev」関数で判定することが可能です。

例として、ファイル名に「_(アンダーバー)」を含むか判定するケースを見てみましょう。

上記①にはアンダーバーが含まれないので、「含まない」と判定し、
上記②にはアンダーバーが含まれるので、「含む」と判定します。

関数の構文と戻り値

Instr関数は以下のように記述します。

Instr(判定開始位置, 文字列, 判定文字列)

「判定開始位置」は、文字列の何文字目から判定するかを指定します。
「文字列」は判定される文字列を指し、「判定文字列」は判定に用いる文字列を指します。

Instr関数からの戻り値は「整数」です。
関数からの戻り値がゼロなら、「判定文字列を含まない」ということになります。
戻り値がゼロより大きい場合は、「文字列の中で判定文字列が存在する位置」がわかります。
以下のように複数の判定文字列を含む場合には、判定開始位置の文字に最も近い文字の位置が返ってきます。

次に、Instrrev関数の書き方です。

InStrRev(文字列, 判定文字列)

Instrrev関数からの戻り値も整数になります。
判定文字列を含まない場合に戻り値がゼロになるという点はInstrと同じですが、戻り値の求め方は異なります。
Instrrevの場合は、「末尾に最も近い判定文字列の文字位置」が戻り値となります。
注意点としては、末尾から何文字目にあるかではなく、先頭から何文字目にあるかが返ってくるという点です。

使用例

使用例①
Instr,Instrrevの戻り値をMsgboxで表示します。
文字列を好きなように書き換えて、戻り値がどのように変化するか確認してみてください。

Sub ExcelVBA_017_Example1()
    MsgBox InStr(1, "a_b_c_d_e", "_") '1文字目(a)に最も近いアンダーバーの位置を求める
    MsgBox InStr(3, "a_b_c_d_e", "_") '3文字目(c)に最も近いアンダーバーの位置を求める
    MsgBox InStrRev("a_b_c_d_e", "_") '末尾の文字(e)に最も近いアンダーバーの位置を求める
End Sub

使用例②
選択ダイアログで選択したファイルパスに、”Sample”という文字が含まれるか判定します。

Sub ExcelVBA_017_Example2()
    Dim StrLine As String
    'ファイル選択ダイアログで選択
    With Application.FileDialog(msoFileDialogFilePicker)
        If .Show = True Then
            StrLine = .SelectedItems(1) '選択したファイルのパスを変数に記憶
        Else
            Exit Sub '選択キャンセルされたら処理終了
        End If
    End With
    'ファイルパスに判定文字列を含む/含まないで条件分岐
    If InStr(1, StrLine, "Sample") > 0 Then
        '"Sample"を含む場合にメッセージ表示
        MsgBox "ファイルパス:" + StrLine + vbNewLine + _
                "ファイルパスに文字列「Sample」が含まれています", vbInformation
    Else
        '"Sample"を含まない場合にメッセージ表示
        MsgBox "ファイルパス:" + StrLine + vbNewLine + _
                "ファイルパスに文字列「Sample」が含まれません", vbInformation
    End If
End Sub

マクロの動作は以下の通りです。

使用例③
InstrとInstrrevを組み合わせて、判定文字(アンダーバー)に挟まれた文字列("技術記事")を表示します。

Sub ExcelVBA_017_Example3()
    Dim StrLine As String
    Dim Rtn1, Rtn2
    StrLine = "ExcelVBA_技術記事_017"
    Rtn1 = InStr(1, StrLine, "_") '1文字目に最も近いアンダーバーの位置を求める
    Rtn2 = InStrRev(StrLine, "_") '末尾に最も近いアンダーバーの位置を求める
    MsgBox Mid(StrLine, Rtn1 + 1, (Rtn2 - 1) - Rtn1) '判定文字で囲まれた文字列を抽出
End Sub

終わりに

今回のVBA記述記事は以上になります。

それでは、また次回お会いしましょう!