【エクセルVBA】指定した範囲内から値を検索するFindメソッドとその使い方


find,method,eyecatch,excel.vba

みなさまこんにちは、ノグチです。

前回は、エクセルのChangeイベントと、入力規則をVBAで操作するValidationオブジェクトを使って、セルに入力した値をマスタシートから検索し、ヒットした値をセルにプルダウンメニューに表示する方法をご紹介しました。

【エクセルVBA】Changeイベントと組み合わせてもっと便利に!検索にヒットした値をドロップダウンリストに表示する方法
エクセルのChangeイベントと、Validationオブジェクトを用いたドロップダウンリストを作成する方法を組み合わせて、セルに入力した値をマスタシートから検索し、検索にヒットした値を入力したセルのドロップダウンリストに表示させる方法をご紹介しています。この方法を使えば、入力作業が楽になるかもしれません。

その記事の中で使っていたFindメソッド

値の検索にはワークシート関数のVlookupなどがありますが、このFindメソッドも値を検索するときにとっても便利なのです。

ということで今回は、このFindメソッドを使って、セルに入力された値で指定範囲を検索する方法をご紹介します!

スポンサーリンク

Findメソッドとは?

Findメソッドは、指定したRange型の範囲から指定した文字列を持つセルを返すメソッドです。

Findメソッドの記述方法

記述方法はこちら。

Rangeオブジェクト.Find(パラメータ)

検索したい値が見つかった場合はそのセルを表すRangeオブジェクトを、検索したい値が指定した範囲の中で見つからなかった場合にはNothingを返してくれます。

Findメソッドのパラメータ

Findメソッドにはいくつかパラメータがありますが、個人的によく使うパラメータが以下です。

パラメータ 役割と指定する値
What 検索したい値を指定するパラメータで、もちろん指定必須です。
LookAt 検索したい値で、部分一致検索なのか全体一致検索なのかを指定します。部分一致の場合はxlPartを、全体一致の場合はxlWholeを指定します。
SearchOrder 行方向に検索するのか列方向に検索するのかを指定します。行の場合はxlByColumnsを、列の場合はxlByRowsを指定します。省略した場合はxlByColumnsがデフォルトでセットされます。

パラメータを使ってFindメソッドを書いてみると、こんな感じになります。

rngSearch = ThisWorkBook.worksheet("マスタデータ").Range("A2:A6").Find (What:="AbC", LookAt:=xlWhole)

Findメソッドを使った検索コードの例

このメソッドを使って、前回の記事でもご紹介した、請求書シートに入力した値でマスタシートを検索し、入力したセルに検索結果を返す、というコードを書いてみましょう。

請求書シートがこちら、

excel,vba,event,請求書

マスタシートがこちらです。

excel,vba,event,マスタシート

請求書シートのB5セルに入力した値で、マスタシートの得意先リストを部分一致検索したい場合、このようなコードになります。

Dim rngSearch, varSearch
Dim myRange As Range

With ThisWorkbook
    
    varSearch = .Worksheets("請求書").Range("B5")
    Set myRange = .Worksheets("マスタ").Range("A1:A6")
    
    Set rngSearch = myRange.Find(What:=varSearch, LookAt:=xlPart)
    .Worksheets("請求書").Range("B5").Value = rngSearch

End With

戻り値がNothingの時の処理も大切

Findメソッドを使う場合は、戻り値がNothingだったとき(検索にヒットする値を持つセルが見つからなかったとき)のことも考えておきましょう。

上のコードで戻り値がNothingだった場合、9行目で検索にヒットした値をセルに出力するときにエラーになってしまいますので、戻り値がNothingだった場合の処理もセットで書くようにしましょう。

検索にヒットするセルがある場合と、Nothingの場合をIF文を使って分岐させると、こんな感じのコードになります。

Dim rngSearch, varSearch
Dim myRange As Range

With ThisWorkbook
    
    varSearch = .Worksheets("請求書").Range("B5")
    Set myRange = .Worksheets("マスタ").Range("A1:A6")

    Set rngSearch = myRange.Find(What:=varSearch, LookAt:=xlPart)
    
    If Not rngSearch Is Nothing Then
        .Worksheets("請求書").Range("B5").Value = rngSearch
    Else
        MsgBox "該当する得意先はありません。"
    End If

End With

End Sub
または、On Error Resume Nextを差し込んでおく方法もありますよ。
Dim rngSearch, varSearch
Dim myRange As Range

With ThisWorkbook

    varSearch = .Worksheets("請求書").Range("B5")
    Set myRange = .Worksheets("マスタ").Range("A1:A6")
    
    Set rngSearch = myRange.Find(What:=varSearch, LookAt:=xlPart)
    On Error Resume Next
    .Worksheets("請求書").Range("B5").Value = rngSearch

End With

いずれにせよ、戻り値がNothing の場合の処理は、必ず書き込んでおくのが安心ですね。

検索した値を取得してみる

では、上のコードを実際に動かしてみます。
検索値を入力するセルに”AAA”と入力します。
エクセル検索値,入力,請求書シート

マスタシートでは、”AAA”を含む得意先名は「AAA株式会社」だけなので、B5セルに「AAA株式会社」と出力されるはずです。

コードを動かしてみると…

エクセル,Find,検索結果

このとおり、ちゃんとB5セルに「AAA株式会社」が出力されていますね。

最後に

今回は、Findメソッドを使って、セルに入力された値で指定範囲を検索する方法をご紹介しました。

次回は、検索値に対して複数の値がヒットする可能性がある場合に使える、FindNextメソッドをご紹介します。

【エクセルVBA】FindNextメソッドで指定範囲内の検索条件にヒットする値をすべて取得する方法
Findextメソッドを使って、指定した範囲内で検索条件にヒットする値を全て取得する方法をご紹介しています。Findメソッドだけだと、指定範囲で一番最初に検索にヒットする値しか取得できませんが、FindNextメソッドなら複数の検索結果を取得できますよ。

それでは最後までお読みいただき、ありがとうございました!


タイトルとURLをコピーしました