みなさん、こんにちは。
ITソリューション事業部の林です。
本記事では、ExcelVBAのテクニックを紹介・解説いたします。
今回紹介するのは、「特定の文字列を含む/含まないの判定方法」です。
【目次】
それでは、始めましょう!
特定の文字列を含むか判定する方法
この判定は、具体的にいうと「文字列の中に特定の単語が含まれているか」を確認する手段になります。
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記述記事は以上になります。
それでは、また次回お会いしましょう!