No.003
データを快速で検索するには 《Find》
2003/2007/2010/2013
Excelにデータがたくさんあり検索していきたいときに、複数の方法がありますが、実感的にFindメソッドが速いかなと思います。
Findメソッドは、Excelの[検索]コマンドに対応します。
指定した範囲からデータを検索し、見つかった際はRangeオブジェクト(セル番地)を返します。見つからなかった場合は、Nothingを返します。
Excelで[検索]を行うときのことを思い出してください。既定の検索は部分一致検索、基本的に検索は1度きりです。[オプション]ボタンをクリックすると、検索の際のいろいろなオプションが表示され、より詳細に検索することができます。
VBAのFindメソッドもほぼ同様の指定ができ、さらに検索を続ける場合は、範囲を新たにしてループしながら検索していくこともできます。
今回はいくつかのサンプルをご紹介していきましょう。
まず簡単なところから、セルA1:A20の範囲で文字列「AA」を検索して、見つかった場合にそのセルを選択します。見つからなかった場合はメッセージを表示します。
Dim rng_find As Range
Set rng_find = Range("A1:A20").Find("AA")
If rng_find Is Nothing Then
MsgBox "ヒットしませんでした。"
Else
rng_find.Select
End If
Findメソッドの書き方は、「検索範囲.Find(検索対象)」です。
そしてここでのポイントは4つあります。
その1、Findメソッドの返しを変数に入れる場合は、Rangeオブジェクトを格納できるように宣言することです。
そのほか、Findメソッドの返したセルの行番号を取得してを変数に入れるケースもよくあります。
Dim int_find As Integer
int_find =Range("A1:A20").Find("AA").Row
行番号でなく番地の文字列を変数に入れる場合は、次のとおりです。
Dim str_find As String
str_find =Range("A1:A20").Find("AA").Address
その2のポイントは、検索して見つからなかったときの対応です。「Nothing」が返るわけですが、そのときのIf文の書き方(上記)も再確認ですね。
ポイントその3は、Findメソッドの検索の既定は部分一致検索です。
では、完全一致検索にするにはどうすればよいでしょうか。
引数LookAtを使い、次のように指定します。
Range("A1:A20").Find("AA", LookAt:=xlWhole)
さらにに全角半角を区別して検索する場合は、引数MatchByteを加えます。 Range("A1:A20").Find(What:="AA", LookAt:=xlWhole, MatchByte:=True)
今まで記述していませんでしたが、検索データである第1引数はWhatです。
ほかの引数については、下記の<ヘルプmemo>をご参照ください。
そしてその4最後のポイントは、範囲の先頭セルに一致するデータがあった場合、最初には検索されないことです。ループさせた場合も最後になります。
さて、1件目の検索データが見つかり、さらに次に同じ検索データで探していきたい場合のサンプルをご紹介します。
今度は全セルでデータを検索していきます。検索されたセルの次のセルから検索を続けていきます。
その場合、引数Afterを使ったり、FindNextメソッドを使います。
Sub Sample()
Dim rng_find As Range '検索されたセルを格納
Dim str_find_1 As String '最初の検索セルの番地(文字列)を格納
Dim str_find_new As String '新たな検索セルの番地(文字列)を格納
Set rng_find = Cells.Find("AA")
str_find_1 = rng_find.Address
MsgBox str_find_1
Do While str_find_new <> str_find_1
Set rng_find = Cells.Find(What:="AA", After:=rng_find)
str_find_new = rng_find.Address
If str_find_new = str_find_1 Then '最初の検索セルが再度検索されたら
Exit Do 'ループを終了
Else
MsgBox str_find_new
End If
Loop
End Sub
検索は右へ下へと進み、検索セルの番地(文字列)が次々にメッセージで表示されていきます。
検索されたセルやデータに何か処理をする場合は、メッセージのところに記述してください。
上記サンプルは、Findメソッドの引数Afterを使用しましたが、FindNextメソッドを使用する場合は、引数Afterがある行のところを、次の文に替えてください。
Set rng_find = Cells.FindNext(rng_find)
特に全セルからデータを探すような場合は、Findメソッドが有効ですので是非使ってみてください。
ヘルプmemo
<Findメソッド>
指定された範囲から情報を検索し、目的の情報が見つかった最初のセルを表すRangeオブジェクトを返します。
検索条件に当てはまるセルが見つからなかった場合は、Nothingを返します。
構文: .Find(What,After,LookIn,LookAt,SearchOrder,SearchDirection,
MatchCase,MatchByte,SearchFormat)
引数:
What …検索対象のデータを指定[省略不可]
After …検索を開始するセルを指定[省略可]
指定したセルの次のセルから検索が開始される
LookIn …検索の情報の種類を指定[省略可]
LookAt …検索対象部分を指定[省略可]
xlPart …部分一致検索(既定)
xlWhole …完全一致検索
SearchOrder …検索するときの行または列の優先順位を指定[省略可]
xlByRows …行優先(既定)
xlByColumns …列優先
SearchDirection …検索の方向を指定[省略可]
xlNext …前へ検索(既定)
xlPrevious …後へ検索
MatchCase …既定値はFalse、大文字/小文字を区別する場合はTrueを指定[省略可]
MatchByte …既定値はFalse、全角/半角を区別する場合はTrueを指定[省略可]
SearchFormat …検索の書式を指定[省略可]
ヒント:
Excelの[検索]コマンドでも同じですが、
引数で既定でない設定を行い、ブックを閉じずに続けてFindメソッドを使用する場合
先の引数設定が引き継がれます。