このサイトの記事内では「アフィリエイト広告」などの広告を掲載している場合があります。
消費者庁が問題としている「誇大な宣伝や表現」とならないよう配慮しコンテンツを制作しておりますのでご安心ください。
問題のある表現が見つかりましたらお問い合わせよりご一報いただけますと幸いです。

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

2024年4月19日

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

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

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

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

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

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

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

VBAが難しいと感じたら
VBAのプロに代わりに作ってもらうのはいかがでしょうか?
ココナラでVBAの作成請負を受け付けています。お気軽にご相談ください。

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が難しいと感じたら
VBAのプロに代わりに作ってもらうのはいかがでしょうか?
ココナラでVBAの作成請負を受け付けています。お気軽にご相談ください。

VBA

Posted by やろまい