【Excel VBA入門】データの検索方法|Find・FindNextをつかった文字検索を解説

操作編

VBAをつかった検索の方法をご紹介します。
セルの検索は日常の業務でもよくつかわれると思いますが、マクロをつかえばより効率的にデータを探し出せるかもしれません。

スポンサーリンク

セルの検索方法|Findメソッドの使い方

セルを検索する|手動で確認

まずは手動でマクロ実行したい動作を確認しておきましょう。
こちらの例をつかいます。

はじめにVBAをつかわないで検索をしてみます。

いずれかの方法で検索をします。

  • エクセル画面で「ctrl」と「F」の同時押し
  • タブ「ホーム」の右側の「検索と選択」を選択

このような「検索」は日常的にされていると思います。

セルを検索する|Findメソッドの構文

今度はさきほどご紹介した内容をマクロをつかって検索する方法をおさえておきましょう。

検索には「Find」メソッドをつかいます。

オブジェクト.Find(What,[After],[LookIn],[LookAt],[SearchOrder],[SearchDirection],[MatchCase],[MatchByte],[SearchFormat])

こちらが構文です。
以下、それぞれの引数についてご紹介します。

What

検索する値を指定します。

After

検索範囲内のセルを指定します。

指定したセルの次のセルから検索が開始されて、指定したセルは最後に検索されます。
省略した場合は、検索範囲の左上のセルから検索が開始されます。

LookIn

検索対象を指定します。

内容
xlFormulas数式
xlValues
xlCommentsコメント

LookAt

検索方法を指定します。

内容
xlWhole完全一致
xlPart部分一致

SearchOrder

検索の順序を指定します。

内容
xlByRows行の方向
xlByColumns列の方向

「行の方向」の場合の検索の動作としては、1行分の検索がおわったら次の行の検索をするといった順序で進みます。
また、「列の方向」の場合の検索の動作としては、1列分の検索がおわったら次の列の検索をするといった順序で進みます。

SearchDirection

検索の方向を指定します。

内容
xlNext「上から下」「左から右」
xlPrevious「下から上」「右から左」

MatchCase

検索文字の区分を指定します。

内容
True大文字と小文字を区分する
False大文字と小文字を区分しない

たとえば、「False」の場合、「A」と「a」はおなじ扱いがされます。

MatchByte

検索文字の区分を指定します。

内容
True半角と全角を区分する
False半角と全角を区分しない

たとえば、「False」の場合、「ア」と「ア」はおなじ扱いがされます。

SearchFormat

書式の検索を指定します。

内容
Trueセルの書式を指定する
Falseセルの書式を指定しない

セルを検索する|Findメソッドの使用例

それでは、さきほどご紹介した内容をマクロをつかって検索をしてみましょう。

先ほどの例を少し変更して検索用のセルを設置しました。
黄色マーキングをしている「セルA1」に値を入力して、それをマクロをつかって検索する方法をとります。

もっとも基本的な検索

ではさっそくコードを書いてみましょう。
まずは必要最低限のマクロで考えてみたいと思います。

Sub test1()
    Dim target_cell As Variant
        Set target_cell = Range("A4:B11").Find(what:=Range("A1").Value, LookAt:=xlWhole)

    target_cell.Select
End Sub

実行結果はこちらです。
マクロをつかって「セルA1」に入力した値を選択しました。

3行目のコードにつかわれている「Set」についてご説明します。

Set 「変数」= オブジェクト

データ型が「オブジェクト型」の変数をつかうとき、変数にオブジェクトを代入するために「Set」をつかいます。

変数に代入するモノは指定したオブジェクトそのものではなく、オブジェクトの情報が保管されている場所を示す値です。
今回の例では、オブジェクトの保管場所の情報は「検索したい対象(「Find」メソッドをつかって検索した値)」になります。

なお、変数のデータ型は「オブジェクト型」にも対応ができるように「Variant」で定義しています。

「Set」はちょっと理解しにくい内容かと思いますので、とりあえず「セル検索をするとき変数につかうもの」としておきましょう。

すこし便利な検索

つぎに検索対象が見つからなかった場合にそなえてメッセージを表示する機能を追加します。

Sub test2()
    Dim target_cell As Variant
        Set target_cell = Range("A4:B11").Find(what:=Range("A1").Value, LookAt:=xlWhole)

    If Not target_cell Is Nothing Then
        target_cell.Select
    Else
        MsgBox ("検索対象は見つかりませんでした。")
    End If
End Sub

こちらがマクロの実行結果です。
親切なことに見つからなかったときの検索結果をお知らせしてくれます。

5行目のコードについてご説明します。

  • If Not
    「Not演算子」をつかって「オン」と「オフ」を切り替えています。
    つまりこの場合は「もし~がなかったら」という解釈になります。
  • Is Nothing
    オブジェクトに「なにも入っていない状態」です。

なお、「If ~ Then」の基本的なつかい方についてはこちらをご確認ください。

セルの検索方法|FindNextメソッドの使い方

「Find」メソッドは特定のひとつのセルを検索するさいにつかいました。
「FindNext」メソッドをつかえば、複数のセルを検索することができます。

セルを検索する|FindNextメソッドの構文

「FindNext」メソッドは、「Find」メソッドとおなじ条件で検索をおこなって検索結果のセルを返します。

オブジェクト.FindNext([After])

引数はこちらです。

引数内容
After検索範囲のセルを指定する。
指定したセルの「次のセル」から検索が開始されて、指定したセルは最後に検索される。
省略した場合は、検索範囲の左上のセルが指定される。

セルを検索する|FindNextメソッドの使用例

こちらの例をつかってご説明します。
「セルA1」に入力した値を「B列から検索」して、該当するセルの「A列の値」をメッセージで表示するマクロをつくります。

さきにコードをご確認ください。

Sub find_next()
    Dim 範囲 As Variant
    Dim 検索セル As Variant
    Dim 開始セル As String
    Dim 検索セルの番号 As Long
    
    検索セル = Cells(1, 1).Value
    
    Set 範囲 = Range("B4:B13")
    Set 検索セル = 範囲.Find(検索セル, LookAt:=xlPart) '部分一致で検索
    
    If Not 検索セル Is Nothing Then '検索セルがあった場合
        開始セル = 検索セル.Address
        Do
            検索セルの番号 = 検索セル.Offset(0, -1)
            MsgBox ("番号:" & 検索セルの番号 & " が見つかりました。")
            Set 検索セル = 範囲.FindNext(検索セル)
        Loop While 検索セル.Address <> 開始セル
    Else
        MsgBox ("該当セルが見つかりませんでした。")
    End If
End Sub

実行結果はこちらです。

ここでのポイントは、「指定したセルは最後に検索される」ところです。
番号「1」がメッセージボックスの「4番目」に表示されていることが確認できます。

以下、それぞれのコードについて解説をします。

範囲の指定|2行目と9行目

変数「範囲」を「バリアント型」で定義しています。
検索範囲のセルを指定します。

検索セル|3行目と10行目

変数「検索セル」を「バリアント型」で定義しています。
先ほど指定した「範囲」から「Find」メソッドをつかって「検索セル」に値を代入します。

開始セル|4行目と13行目

変数「開始セル」を「文字列型」で定義しています。

のちほどつかう「Do ~ Loop」での無限ループを防止するために、「検索セル」の情報を記録しています。
この設定がないとプログラムが検索をしつづける状態となってしまい、こちらの例の場合、検索結果の番号が「4→5→9→1→4→5→9→1…」となります。

なお、「address」メソッドはこちらです。

オブジェクト.address([RowAbsolute],[ColumnAbsolute],[ReferenceStyle],[External],[RelativeTo])

指定した範囲のセル番号を取得します。
引数はこちらです(すべて省略可能)。

引数内容
RowAbsolute「True」…行番号を絶対参照
「False」…行番号を相対参照
ColumnAbsolute「True」…列番号を絶対参照
「False」…列番号を相対参照
ReferenceStyleセル範囲の参照方法を指定する。
「xlR1C1」…R1C1形式で取得
省略…A1形式で取得
External「True」…取得した値にブック名とシート名を含む。
「False」…既定値。取得した値にブック名とシート名を含まない。
RelativeTo相対参照を開始する位置を指定する。
(相対参照かつR1C1形式の場合)

検索セルの番号|5行目と15行目

変数「検索セルの番号」を「整数型」で定義しています。

検索セルを基準に「Offset(0,-1)」をつかって、1つ左側の列を指定しています。

If ~ Then|12行目

「Find」メソッドで使用した方法とおなじです。

If Not」…「Not演算子」をつかって「オン」と「オフ」を切り替えています。
Is Nothing」…オブジェクトに「なにも入っていない状態」です。

Do ~ Loop|14行目から18行目

17行目の「FindNext」で「検索セル」の値を更新をしています。

「Do ~ Loop While」で「検索セル」と「開始セル」の値が一致しないかぎり、ループを継続させています。
「検索セル」と「開始セル」の値が一致した時点で、繰返処理が終了します。
なお、基本的な繰返処理「Do ~ Loop」の使い方についてはこちらをご確認ください。

まとめ

VBAをつかった検索の方法についてご紹介をしました。

こちらでご紹介した内容をそのままつかうだけでは「業務の効率化」にはすぐに結びつかないかと思います。

しかし、少しご紹介した条件分岐「If ~ Then」や繰返処理「Do ~ Loop」などと組み合わせてつかうことによって、検索の効率化がいっきに高まる可能性がありますので、まずはVBAをつかった基本的な検索方法のイメージをつかんでいただければと思います。