ヘルプの森~Excel・Access・Office全般ヘルプデスクサイト

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メソッドを使用する場合
  先の引数設定が引き継がれます。

twitter hatena line pocket

関連ヘルプ

ブック内のすべてのワークシートで同じ処理を行う 《For Each~Next》
ブックを開くとき、閉じるときにマクロを自動実行したい 《イベント プロシージャ》
アプリケーションを起動し動作させる 《Shell・SendKeys・Wait》
エラーの種類、そしてエラー処理の設置方法について 《On Error GoTo》
InputBox のテキスト ボックス入力時に日本語入力をオンにする 《SendKeys》
Excelのデータをテキスト ファイルに書き出す(出力する) 《Open・Print・Close》
ExcelからOutlookでメールを作成・送信する基本のVBA 《CreateObject関数》
Excelのメールアドレス データを使用し、Outlookのメールを自動送信する 《CreateObject関数》
ソートしたグループごとのデータを別ブックに分割するサンプルVBA
右クリック、印刷、上書き保存などブックに規制をかける 《イベント プロシージャ Cancel=True》
フォルダー内のすべてブックを開いて同じ処理を行う 《Do~Loop・Dir》
フォルダー内のすべての画像ファイルをペイントで開きサイズ変更
フォルダー内のフォルダーとファイルの一覧をセルに書き出す1 《Dir》
フォルダー内のフォルダーとファイルの一覧をセルに書き出す2 《FileSystemObject》
フォルダー内のファイル名を変更する 《Do~Loop・Dir・Name~As》
ColorプロパティとRGB関数について、Color値からRGB、RGBからColor値を求める方法 《Color・RGB関数》