【Excel VBA入門】Findメソッドで条件に一致するセルを検索する方法

【Excel VBA入門】Findメソッドで条件に一致するセルを検索する方法

こんにちは、業務自動化ツール開発担当の吉池(@valmore_myoshi)です。

  • 特定の範囲内からある値を含むセルを探したい
  • 条件に当てはまるセルをまとめて操作したい

と思うことはVBAを使っていればよくあります。

そんなときはFindメソッドが便利です。本記事では、条件に当てはまるセルを検索できるよう、Findメソッドの基本的な使い方や注意点を解説します。

Findメソッドとは

Findメソッドとは、特定の範囲内(Rangeオブジェクト)から条件に当てはまるセルを検索します。条件に合ったセルが見つかればRangeオブジェクトを返し、見つからなければNothingが返ります。

Set range = Rangeオブジェクト.Find(条件に合わせた引数)

Findメソッドの引数

Findメソッドの引数は以下の通りです。数は多いですが、よく使うWhatLookAtSearchOrderの3つを覚えておきましょう。

  • What(必須): 検索するデータを指定します
  • After: 検索開始のセルを指定。ここで指定したセルの次のセルから検索
  • LookIn: 検索対象を設定。xlValuesは値、xlFormulasは数式、xlCommentsはコメント
  • LookAt: 検索条件を指し、全文一致の場合はxlWhole、部分一致はxlPartを指定
  • SearchOrder: 検索方向を指し、1列ごと検索する場合はxlByColumns、1行ごと検索する場合はxlByRowsを指定
  • SearchDirection: 検索の向きを指定。xlNextは上から下、xlPreviousは下から上に検索
  • MatchCase: 大文字と小文字を区別するかをTrue、Falseで指定
  • MatchByte: 全角と半角を区別するかをTrue、Falseで指定
  • SearchFormat: 書式検索するか否かをTrue、Falseで指定

引数を使ってFindメソッドを書くと下記のようになります。

Dim rng As Range

Set rng = ThisWorkbook.Worksheets(1).Range("A2:B9") _
    .Find(What:="りんご", LookAt:=xlWhole, SearchOrder:=xlByRows)
MsgBox rng.Value

Findメソッドの注意点

Findメソッドの引数を省略すると、Excelファイル固有の検索設定が適用されるので注意しましょう。検索設定は、検索と置換ダイアログから確認できます。

また、引数を設定して実行すると、設定した値で検索設定が上書きされます。Findメソッドを使うときはこの特性に注意が必要です。

Findメソッドの使い方

続いてFindメソッドの基本的な使い方を見ていきます。条件の設定方法を覚えてFindメソッドを使いこなしましょう。

全文一致で検索

全文一致とは、検索対象の値と検索語の値がすべて一致することを指します。大文字・小文字は区別されません。全文一致で検索する場合はLookAt引数にxlWholeを指定します。

例えば、下記のような商品表からぶどうを探す場合を考えてみましょう。

ぶどうを完全一致で検索するときは下記のように書きます。商品表をRangeで指定して全文一致検索をしています。

Dim rng As Range

Set rng = ThisWorkbook.Worksheets(1).Range("A2:B9") _
    .Find(What:="ぶどう", LookAt:=xlWhole)
MsgBox rng.Value

部分一致で検索

部分一致とは、検索対象の値に検索語が一部含まれる場合を指します。検索対象が「青りんご」だとして、「青」を部分一致で検索すると考えればわかりやすいでしょうか。

部分一致の場合はFindメソッドのLookAt引数にxlPartを指定します。下記商品表の青りんごを検索する場合で考えてみましょう。

青りんごの「青」で部分一致検索するには下記のように書きます。

Dim rng As Range

Set rng = ThisWorkbook.Worksheets(1).Range("A2:B9") _
    .Find(What:="青", LookAt:=xlPart)
MsgBox rng.Value

複数セルを検索

条件に当てはまるセルが複数ある場合はどうでしょう。Findメソッドは最初に見つけた1つのセルしか返せませんが、FindNextFindPreviousメソッドを使うと複数のセルを検索できます。

FindNext、FindPreviousメソッドともにFindメソッドで開始した検索を続行しますが、検索方向が異なります。FindNextは下方に、FindPreviousは上方に検索していきます。

例えば、下記商品表から「桃」と部分一致するセルを検索してみましょう。

FindNextを使って「桃」と部分一致するセルをダイアログ表示するには下記のように書きます。

Dim rng As Range
Dim firstAddress As String

‘ 商品表をRangeで指定
With ThisWorkbook.Worksheets(1).Range("A2:B9")
    Set rng = .Find("桃")
    If Not rng Is Nothing Then
        firstAddress = rng.Address
        
        Do
            MsgBox rng.Value
	    ‘ 前回値が見つかったセルの次から検索
            Set rng = .FindNext(rng)
            If rng Is Nothing Then
                GoTo DoneFinding
            End If
        Loop While rng.Address <> firstAddress
    End If
    DoneFinding:
End With

値が見つからないときの対策

Findメソッドで検索した値が見つからないときはNothingが返ります。そのため、下記のように書いたときに値が見つからない場合、エラーが発生します。

Dim rng As Range

Set rng = ThisWorkbook.Worksheets(1).Range("A2:B9").Find(What:="りんご")
MsgBox rng.Value

このときrngにNothingが代入されますが、続けてメッセージボックスにValueプロパティで値を出力しています。NothingにはValueプロパティがないため、ここでエラーが発生します。

エラーを防ぐためにも検索した値が見つからない場合に備えましょう。下記の例では、条件分岐でNothingを判別しています。

Dim rng As Range
    
Set rng = ThisWorkbook.Worksheets(1).Range("A2:B9").Find("りんご")
If rng Is Nothing Then
    MsgBox "検索した値が見つかりません"
Else
    MsgBox rng.Value
End If

まとめ

findの基本的な使い方を解説してきました。注意点でも書きましたが、Excelファイル固有の検索設定に影響を受ける点に要注意。これを知らないと意図しない検索条件になってしまいます。

条件に当てはまる値を楽に検索できるFindメソッドを使ってExcel操作をより効率的にしていきましょう。