すべて検索する


下図のような表があったとき、検索機能で"田中"を探してみます。

このとき、[すべて検索]ボタンをクリックすると、次のように、条件に一致したすべてのセルがリストアップされます。

このように、検索したいセルが複数存在したとき、それらをすべて検索するにはどうしたらいいでしょう。

まず、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ケースについて、やり方を解説します。

  • 見つかったすべてのセルを選択状態にする
  • 見つかったセルを別のシートにコピーする
  • 見つかったセルのアドレスをUserFormで表示する

長くなるので、それぞれページを分けて解説しましょう。

見つかったすべてのセルを選択状態にする >> 次ページ