【InStr関数を改良】x個目の文字位置を返す関数(VBAライブラリ)

Instr関数にちょっと不満があります

Instr関数は、ある文字列が別の文字列の中で最初に現れる位置を返す関数です。

例えば、Instr(“abcdefg", “f")するとfは左から6個目なので6を返します。

とても便利な関数なのですが、返してくれるのは最初に現れる位置で2回目に現れる位置を調べることはできません。

これが不満だったんですよね

そしてx個目の位置を調べたいケースが出てきたので、自作関数(ライブラリ)を作ることにしました。

便利な関数だと思うので、コードを紹介したいと思います。

x個目の文字位置を返す関数InStrX

Private Function InStrX(sentence As String, word As String, x As Long) As Long: InStrX = 0
'sentenceに含まれるx個目のwordの位置を返す
'x個目のwordが存在しない場合は0を返す

    Dim count_i As Long
    For count_i = 1 To x
        'x個目の文字列が存在しない場合
        If InStr(InStrX + 1, sentence, word) = 0 Then InStrX = 0: Exit Function
        
        InStrX = InStr(InStrX + 1, sentence, word)
    Next

End Function

関数名はInstrXとしました。インテリセンスで候補表示した時の分かりやすさを重視しています。

モジュール名. と打ち込むとモジュール内のプロシージャが候補として表示されます

この関数の引数はsentence、word、xの3つです。
最初の2個はInstrと同じように文字列です。xは左から何個目の文字列かを指定します。

For文を使い、検索範囲を狭めていくことでx個目の文字列の位置を特定しています。

サンプルコード

Sub test()

    Debug.Print InStrX("すももももももももはもも", "も", 5) '6
    Debug.Print InStrX("すももももももももはもも", "は", 5) '0
    
End Sub

“すももももももももはもも"で検索文字列を"も"、x=5とすると6が返されます。

“すももももももももはもも"で検索文字列を"は"、x=5とすると0が返されます。(5個目の"は"は無いため)

他の「VBAライブラリ」の記事はこちらからどうぞ