みなさまこんにちは、ノグチです。
前回は、エクセルのChangeイベントと、入力規則をVBAで操作するValidationオブジェクトを使って、セルに入力した値をマスタシートから検索し、ヒットした値をセルにプルダウンメニューに表示する方法をご紹介しました。
その記事の中で使っていたFindメソッド。
値の検索にはワークシート関数のVlookupなどがありますが、このFindメソッドも値を検索するときにとっても便利なのです。
ということで今回は、このFindメソッドを使って、セルに入力された値で指定範囲を検索する方法をご紹介します!
Findメソッドとは?
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メソッドを使った検索コードの例
このメソッドを使って、前回の記事でもご紹介した、請求書シートに入力した値でマスタシートを検索し、入力したセルに検索結果を返す、というコードを書いてみましょう。
請求書シートがこちら、
マスタシートがこちらです。
請求書シートの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
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株式会社」だけなので、B5セルに「AAA株式会社」と出力されるはずです。
コードを動かしてみると…
最後に
今回は、Findメソッドを使って、セルに入力された値で指定範囲を検索する方法をご紹介しました。
次回は、検索値に対して複数の値がヒットする可能性がある場合に使える、FindNextメソッドをご紹介します。
それでは最後までお読みいただき、ありがとうございました!