トップページ >
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キーワードを使います。この書き方はセル検索の基本です。
[セル範囲の取得]戻る← | →最初に戻る[目次]