複数回登場する文字列をすべて検索する方法を解説します。
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
自分のやりたい処理にあわせて、お好きなコードをご参考ください。