和風スパゲティのレシピ

日本語でコーディングするExcelVBA

複数回登場する文字列をすべて検索する - InStr

複数回登場する文字列をすべて検索する方法を解説します。

InStr関数の「検索開始位置」に「前回の発見位置+1」を渡し、
発見されなくなるまでDo文をループ
して順次検索します。

サンプルコード

Sub 複数回登場する文字列をすべて検索する()
    
    ' 検索対象
    Dim テキスト全体 As String: テキスト全体 = "みかんいちごみかんりんごみかん"
    Dim 検索値 As String: 検索値 = "みかん"
    
    ' 文字列が見つからなくなるまでループ
    Dim 発見位置 As Long
    Dim 前回の発見位置 As Long: 前回の発見位置 = 0
    Do
        
        発見位置 = InStr(前回の発見位置 + 1, テキスト全体, 検索値)
        If 発見位置 = 0 Then Exit Do
        
        '///ここに発見時の処理
        Debug.Print 発見位置
        
        前回の発見位置 = 発見位置
    Loop
    
End Sub

解説

InStr関数は第1引数に検索開始位置を指定することが出来ます。

ここに「前回の発見位置+1」を渡すことで、
前回の文字列が発見されなくなりますので、
結果として次の文字列を発見していくことが出来ます。

あとは発見されなくなるまでDoループを回せばOKです。


丁寧に変数名を付けましたので、
解説はなくともソースコードを読めば流れはつかめると思います。

こういった複雑なループを書く場合は、
分かりやすい変数名を心がけましょう。

登場回数のカウントや文字列の重複判定

登場回数をカウントし、○回目だけ処理といったコードにするには、
以下のように「登場回数」変数を追加します。

Sub 複数回登場する文字列をすべて検索する()
    
    ' 検索対象
    Dim テキスト全体 As String: テキスト全体 = "みかんいちごみかんりんごみかん"
    Dim 検索値 As String: 検索値 = "みかん"
    
    ' カウント用変数
    Dim 登場回数 As Long: 登場回数 = 0
    
    ' 文字列が見つからなくなるまでループ
    Dim 発見位置 As Long
    Dim 前回の発見位置 As Long: 前回の発見位置 = 0
    Do
        
        発見位置 = InStr(前回の発見位置 + 1, テキスト全体, 検索値)
        If 発見位置 = 0 Then Exit Do
        
        登場回数 = 登場回数 + 1
        
        '///ここに発見時の処理(2回目の登場でだけ処理)
        If 登場回数 = 2 Then
            Debug.Print 発見位置
        End If

        前回の発見位置 = 発見位置
    Loop
    
End Sub

 
あとはあまりないかもしれませんが、
「---」から「--」を検索する際に、
1回しか見つかっていないとみなしたい
ことがあります。

上記のコードでは「1~2個目の-」「2~3個目の-」で、
2つ見つかったことになってしまいますからね。


この処理を書くには、「文字列の長さ」を変数として用意し、
検索開始位置に「前回の発見位置+文字列の長さ」を渡せばOKです。

Sub 複数回登場する文字列をすべて検索する()
    
    ' 検索対象
    Dim テキスト全体 As String: テキスト全体 = "みかんいちごみかんりんごみかん"
    Dim 検索値 As String: 検索値 = "みかん"
    
    ' 文字数カウント用変数
    Dim 登場回数 As Long: 登場回数 = 0
    Dim 検索値の長さ As Long: 検索値の長さ = Len(検索値)
    
    ' 文字列が見つからなくなるまでループ
    Dim 発見位置 As Long
    Dim 前回の発見位置 As Long: 前回の発見位置 = 1 - 検索値の長さ
    Do
        
        発見位置 = InStr(前回の発見位置 + 検索値の長さ, テキスト全体, 検索値)
        If 発見位置 = 0 Then Exit Do
        
        登場回数 = 登場回数 + 1
        
        '///ここに発見時の処理
        Debug.Print 発見位置
        
        前回の発見位置 = 発見位置
    Loop
    
End Sub

 
自分のやりたい処理にあわせて、お好きなコードをご参考ください。