検索の基本はFindメソッド


まずは[検索]テクニックです。下のようなデータを対象とします。[商品コード]列から「A007」を検索してみましょう。

Sub Sample01()
    Dim FoundCell As Variant
    With Worksheets("Sheet1")
        Set FoundCell = .Range("A2:A11").Find("A007")
        If FoundCell Is Nothing Then
            MsgBox "A007は見つかりません。", vbExclamation
        Else
            MsgBox "A007は、" & FoundCell.Address & "です。" & vbCrLf & _
                 "A007は、" & FoundCell.Row & "行目です。", vbInformation
        End If
    End With
End Sub

Excelをデータベース的に使うとき、何はなくとも検索は必須テクニックです。任意のセル範囲内にお目当てのデータが入力されているかどうかは、Findメソッドで知ることができます。FindメソッドはExcelの検索機能を実行する命令です。[編集] - [検索] で表示される [検索]ダイアログボックスで指定できるオプションはすべて指定できます。詳しくはヘルプでFindメソッドを調べてください。

Findメソッドで注意しなければならないのは、検索の結果を調べるということです。検索に成功したときFindメソッドが返すのはRangeオブジェクト(セルそのもの)です。見つかったセルのアドレスでも、見つかったセル内のデータでもありません。上記の

Set FoundCell = .Range("A2:A11").Find("A007")

で、変数FoundCellには見つかったセルA8 そのもの (Range("A8")) が入ります。ですからアドレスや行番号を取得するときはFoundCell.AddressやFoundCell.Rowのように Rangeオブジェクトのプロパティを指定するわけです。

ところが、問題は検索に失敗したとき、つまり指定されたデータが見つからなかったときです。このとき FindメソッドはNothingという特別な値を返します。Nothingはセル(Rangeオブジェクト)ではありません。Nothingが格納されている変数FoundCellに対して、FoundCell.AddressやFoundCell.Rowとプロパティを参照するとエラーになります。したがって、Findメソッドを使ったら、返り値がNothingかどうかを調べなければなりません。変数がNothingかどうかを判定するときは、

If FoundCell = Nothing Then  ''間違い

= を使うのではなく

If FoundCell Is Nothing Then  ''正しい

のように Is 演算子を使う点にも注意してください。