はじめに
文字列の中にある検索ワードが含まれているかを検索のに InStr関数をよく使います。
InStr関数は1回の検索で処理を抜けるため、文字列内に複数の検索ワードが含まれている場合は、繰り返しと条件分岐を使います。
まずは、InStr関数の使い方をおさらいしましょう。
InStr関数の使い方
InStr関数の詳細については、以下のページを参考にしてみてください。
InStr関数は、検索対象文字列の中に検索する文字列が何番目に見つかったかを返してくれます。もし見つからない場合は0を返します。
引数は以下の様になります。
InStr([開始位置, ] 検索対象文字列, 検索する文字列 [, 検索モード])
[ ] 内の値は省略できます。
単純に検索する文字列があるかどうかを知りたい場合は以下のようなコードになります。
Sub testInstr()
Dim str As String
str = "ABCDEAB"
If InStr(str, "AB") > 0 Then
Debug.Print "見つかりました。"
Else
Debug.Print "見つかりませんでした。"
End If
End Sub
このコードでは、InStr関数が検索文字を見つけられなかった時に0を返す事を利用しています。「とにかく検索文字があるかどうか調べたい」という時によく使います。
文字列を複数回検索する
InStr関数を使って複数回検索を行う場合は、1回目の検索結果を利用して、2回目の検索の開始位置を調節するようにします。
これを繰り返し、検索結果が0になるまで繰り返せば、ヒットした位置を複数回取り出す事ができます。
プログラムコードは以下の様になります。
Sub testInstr2()
Dim str As String, hit As Long
str = "ABCABCABC"
hit = 0
Do
hit = InStr(hit + 1, str, "AB")
If hit < 1 Then Exit Do
Debug.Print hit
Loop
End Sub
このプログラムでは、“ABCABCABC” の中で “AB” が出現する文字位置を複数回検索して返してくれます。
イミディエイトウィンドウには、 1、4、7 と出力されます。
繰り返し処理は、Do Loop で繰り返し、検索がヒットしなかった場合にDo Loop を抜けます。
今度は、セルにある文字列を検索して、検索文字列のフォント色を変更してみましょう。
検索文字列の文字色を変更する
セルの文字列の書式設定を変えるには、ActiveCell.Charactersを使います。
使い方については、以下のページで解説していますので参照してください。
・セル文字列の書式設定を部分的に変更する
以下のようなセルの”AB”部分を変更してみます。

上記のプログラムの Debug.Print の行を ActiveCell.Characters に変更します。
引数には検索文字列の長さも必要なので、変数 l で指定しています。
Sub testInstr3()
Dim sStr As String, l As String, hit As Long
sStr = "AB"
l = Len(sStr)
hit = 0
Do
hit = InStr(hit + 1, ActiveCell.Text, sStr)
If hit < 1 Then Exit Do
ActiveCell.Characters(Start:=hit, Length:=l).Font.Color = RGB(255, 0, 0)
Loop
End Sub
実行すると以下の様になります。
セルの値が数値型や日付型だと上手くいきませんので注意してください。

まとめ
今回のように、文字列を複数回検索するには InStr関数を複数回実行する必要があります。
また、第一引数の検索開始位置も指定する必要があります。
Do Loop に関してはプログラムを間違えると無限ループとなりExcelが反応しなくなる事があります。
開発段階では、”Loop”の行にブレークポイントを設置するか、”Loop”の前に Stop を書けば、繰返し処理を1回づつ止めながら動作させる事ができます。
Do Loop を書くときは注意を払いましょう。