セルの検索


何はなくともFindメソッド

下のようなデータを例に、セルの検索を解説します。

いつものように、まずマクロ記録してみましょう。次のコードは、このリストで「土屋」を検索した操作を記録しました。

Sub Macro1()
    Cells.Find(What:="土屋", After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _
        xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
        , MatchByte:=False, SearchFormat:=False).Activate
End Sub

こりゃまた、ややこしいコードが記録されました。順を追って解説しましょう。ワークシート上でセルを検索するには、Findステートメントを使います。Findステートメントの構文は次の通りです。

expression.Find(What, After, LookIn, LookAt, SearchOrder, SearchDirection, MatchCase, MatchByte, SearchFormat)

引数の中で最も重要なのは[What]です。引数[What]には、検索する文字列を指定します。さて引数ではありませんが、expressionには検索するセル範囲を指定します。上の操作で記録されたコードは、Cells.Findとなっていました。Cellsはワークシート上の全セルを表しますので、ワークシート全体が検索の対象になりました。たとえば上の図で、Range("A1:B8").Find(What:="土屋")のように書くと、「土屋」はRange("A1:B8")に含まれませんので見つかりません。

その他の引数をまとめて解説します。
[After]
ここに指定したセルの次から検索を開始します。省略するとexpressionの左上セルを指定したことになります
[LookIn]
検索する対象を指定します
[LookAt]
完全一致検索をするかどうか指定します
[SearchOrder]
検索の方向を指定します
[SearchDirection]
検索の向きを指定します
[MatchCase]
大文字と小文字を区別して検索するかどうかを指定します
[MatchByte]
半角文字と全角文字を区別して検索するかどうかを指定します
[SearchFormat]
書式を検索の条件に含めるかどうかを指定します

引数[SearchFormat]は、Excel 2002以降で使用できます。それぞれの引数に指定できる定数などはヘルプをご覧ください。

Findメソッドで見つからなかったとき

Findメソッドを使うときに注意することは、見つからなかったときの対応です。Findメソッドは、引数Whatで指定された文字列を、指定した範囲(expression)の中で探し、見つかった場合は、見つかったセルを返します。セル内のデータではなく、セル(Rangeオブジェクト)です。ここがポイントです。

次のコードは、「土屋」を検索して見つかったセルA9を選択します。

Sub Sample1()
    Range("A:A").Find(What:="土屋").Select
End Sub

ところがこのコードには重大なバグが潜んでいます。「土屋」が見つからないとき、つまり検索に失敗したときはエラーになってしまうのです。

Findメソッドは、引数Whatに指定した検索値が見つかった場合は、見つかったセル(Rangeオブジェクト)を返します。ただし、見つからなかった場合はNothingという特別な状態を返します。Nothingが何かということはともかく、重要なことは「Nothingはセル(Rangeオブジェクト)ではない」ということです。セル(Rangeオブジェクト)ではないのですから、当然Selectメソッドで選択することもできません。上記のエラーメッセージは「NothingをSelectできません」という意味なのです。失敗が許されない検索など、検索とは呼べません。Findメソッドでセルを検索するときは、必ずFindメソッドの結果(返り値)がNothingかどうか調べるようにしましょう。それには、Findメソッドの結果を変数に格納します。そして、その変数がNothingの状態かどうかを判定するのです。

Sub Sample2()
    Dim FoundCell As Range    ''またはバリアント型(Variant)とする
    Set FoundCell = Range("A1").CurrentRegion.Find(What:="土屋")
    If FoundCell Is Nothing Then
        MsgBox "検索に失敗しました"
    Else
        FoundCell.Select
    End If
End Sub

Findメソッドの結果を格納する変数FoundCellを宣言します。変数FoundCellは、Range型またはVariant型とします。たとえ、検索するデータが文字列であっても String型などとしてはいけません。Findメソッドの結果を変数に格納するときにはSetステートメントを忘れないでください。そして、変数FoundCellがNothingの状態かどうか「FoundCell = Nothing」ではなく「FoundCell Is Nothing」とIs演算子を使います。この書き方はセル検索の基本です。

なお、セル内に入力されている日付を検索するときは注意が必要です。詳しくは、下記のページで解説していますので、ご覧ください。

日付を検索する