wrote :: 2005.12.15

トップページ > Excel > VBA > 講座:セルの操作 > セルの検索

セルの検索

■何はなくとも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("A1").CurrentRegion.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
    Set FoundCell = Range("A1").CurrentRegion.Find(What:="土屋")
    If FoundCell Is Nothing Then
        MsgBox "検索に失敗しました"
    Else
        FoundCell.Select
    End If
End Sub

Findメソッドの結果を格納する変数FoundCellを宣言します。変数FoundCellには、セル(Rangeオブジェクト)またはNothingが格納されるのですから、Range型またはバリアント型で宣言しなければなりません。
Findメソッドの結果を変数に格納するときにはSetステートメントを忘れないでください。
そして、変数FoundCellにNothingが格納されているかどうかは「FoundCell = Nothing」ではなく「FoundCell Is Nothing」とIsキーワードを使います。この書き方はセル検索の基本です。


[セル範囲の取得]戻る← | →最初に戻る[目次]