セルの操作(セルの検索)
何はなくとも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 キーワードを使います。この書き方はセル検索の基本です。
なお、セル内に入力されている
日付 を検索するときは注意が必要です。詳しくは、下記のページで解説していますので、ご覧ください。