下図のような表があったとき、検索機能で"田中"を探してみます。
このとき、[すべて検索]ボタンをクリックすると、次のように、条件に一致したすべてのセルがリストアップされます。
このように、検索したいセルが複数存在したとき、それらをすべて検索するにはどうしたらいいでしょう。
まず、1つだけ検索する、一般的なやり方を試してみましょう。
Sub Sample1() Dim FoundCell As Range Set FoundCell = Cells.Find(What:="田中") If FoundCell Is Nothing Then MsgBox "見つかりません" Else FoundCell.Activate End If End Sub
検索の基本とも言えるコードです。特に難しくはありませんね。
さて、Findメソッドには引数Afterがあります。この引数Afterに、見つかったセルを次々と指定すれば、すべてのセルを検索できそうです。しかし、Rangeオブジェクトには、FindNextメソッドという便利な機能があります。FindNextメソッドは、直前の検索を繰り返す命令で、まさに今回のような「すべてを検索」を想定したかのようなメソッドです。今回は、このFindNextメソッドを使ってみましょう。
FindNextメソッドも、Findメソッドと同じ引数Afterを指定できます。てゆーか、用意されている引数は、それ1つだけです。また、FindNextメソッドは、すべてのセルを検索し終わり、いわゆる"一周しても"自動的に終了はしません。このへんは、Dir関数とは違いますね。なので、すべてのセルを検索するには、最初に見つかったセルのアドレスを覚えておき、再びそのセルに戻ってきたら検索を終了する、という流れが必要になります。
まぁ、だいたい上のような感じでしょうか。
「すべてを検索する」という処理は、FindNextを使ってできます。ただ、この手の処理で問題は見つかった複数のセルをどうするかです。たとえば、見つかったセルのアドレスをMsgBoxで表示するのか、イミディエイトウィンドウに出力するのか・・・どちらも実務的ではありませんね。一般的に実務では、見つかったセルに対して別の処理が必要になります。そしてそれは、検索のテクニックとは別の話です。ひとつの業務をこなすには、複数のテクニックを合体させなければなりません。だから難しいんですね。
ここでは、次の3ケースについて、やり方を解説します。
長くなるので、それぞれページを分けて解説しましょう。