【Excel VBA】Findメソッドで検索(完全一致、部分一致、複数一致)を行う方法を解説

  • 2024.10.04
       
【Excel VBA】Findメソッドで検索(完全一致、部分一致、複数一致)を行う方法を解説

Excel VBAのFindメソッドとは、指定したセル内の数式や文字列など特定の情報を検索するメソッドです。Findメソッドを使用することで、検索ボックスよりも高度な検索が行えます。ここではFindメソッドの仕様や基本的な使い方からFindメソッドの応用法まで解説していきます。

Findメソッドとは?

Findとは、Excelのワークシート内で指定した数式や文字列などを検索するためのメソッドです。

Excelでショートカットキー<Ctrl + F>を押したときに表示される検索ボックスでの検索機能と同じように検索することができるほか、他のメソッドなどと組み合わせることでVBAならではの高度な検索や、一括編集などが行えます。

Findメソッドの書き方は以下のとおりです。

基本構文

Range.Find(What, After, LookIn, LookAt, SearchOrder, SearchDirection, MatchCase, MatchByte, SearchFormat)

Range は Range オブジェクトを表しています。実際にはワークシート内で文字列を検索する範囲を Range や Cells といったプロパティで設定します。

Rangeプロパティの使い方については以前の記事でご紹介していますので、そちらをご覧ください。

【あわせて読みたい】

【Excel VBA】Rangeでセルを範囲選択する方法を解説

Findメソッドの引数には記述が必須のものと省略可能なものがあります。基本構文を見るとたくさんの引数が必要になると思われるかもしれませんが、実際には大半が省略可能です。

  • What(必須): テキストや数式など、検索する内容を””で囲んで指定します。

  • After(省略可能)
    検索を開始するセルの手前の位置を指定します。指定できるのは1つのセルだけです。
    省略した場合はRangeで指定した範囲の左上端のあとから検索方向で次の位置のセルから検索開始します。

  • LookIn(省略可能)
    検索内容の種類を指定します。省略した場合は数式と見なして検索を開始します。指定できる値はxlFormulas(数式)、xlValues(値)、xlComments(コメント)、xlCommentsThreaded(スレッド化されたコメント)のどれかです。
    省略した場合は数式として検索が開始されます。

  • LookAt(省略可能)
    検索内容に完全一致するか、部分一致するかを指定できます。指定できる値はxlPart(部分一致)、xlWhole(完全一致)です。
    省略した場合は部分一致検索を行います。

  • SearchOrder(省略可能)
    検索する方向を横(行: Rows)と縦(列: Columns)のどちらかに指定できます。
    指定できる値はxlByRows(行方向)あるいはxlByColumns(列方向)のどちらかです。
    省略した場合は横方向に検索を行い、範囲内の列の端まで到達したら次の列を検索します。

  • SearchDirection(省略可能)
    次のセルを検索する際に、前のセルを検索するか後のセルを検索するかを指定できます。
    指定できる値はxlNext(後のセルを検索)とxlPrevious(前のセルを検索)

  • MatchCase(省略可能)
    検索内容の大文字と小文字の区別を指定します。
    大文字と小文字を区別して検索する場合はTrueに、区別しないで検索する場合はFalseにします。
    省略した場合は大文字と小文字を区別せずに検索します。

  • MatchByte(省略可能)
    マルチバイト文字(全角)と1バイト文字(半角)を区別するかどうかを指定します。
    全角/半角を区別する場合はTrueを、区別しない場合はFalseにします。
    省略した場合は文字の全角/半角を区別せずに検索します。
    マルチバイト文字を使用する言語が入っているときだけ有効になる設定ですが、日本語が入っているExcelファイルは常に有効になっていると考えて問題ありません。

  • SearchFormat(省略可能)
    検索の書式を指定するかどうかを選択します。
    書式を指定する場合はTrueを、指定しない場合はFalseにします。
    厳密な検索を行わない場合はあまり使用しません。

検索する内容を指定する What だけは必ず入力する必要がありますので、注意しましょう。 What は検索ボックスの「検索する文字列」の部分に相当します。

Findの使い方は?具体例・サンプルコードで解説

完全一致検索を行う

まずは、文字列が全て一致する完全一致検索の方法を解説していきます。下のサンプルコードを実行してみましょう。

【サンプルコード】

Sub FindSample1()
    Dim src As Range
    Dim txt As String
    Dim srcObj As Range
    txt = "テックマニア"
    Set src = Range("A1:A4")
    Set srcObj = src.Find(txt, LookIn:=xlValues, LookAt:=xlWhole)
    If Not srcObj Is Nothing Then
        MsgBox "'" & txt & "'は" & srcObj.Row & "行目にあります"
    Else
        MsgBox "'" & txt & "'はありませんでした"
    End If
End Sub

【実行結果】

Findの引数 LookAtxlWhole を代入することで完全一致検索になります。ここでは、「テックマニア」という文字列と完全に一致するものがあるかどうかを検索し、ある場合は何行目にあるかを表示しています。

また、上のサンプルコードでは、Ifステートメントを使い、検索した文字列が存在するかどうかで条件を分けています。

このように条件を分けて記述する理由は、文字列が存在しない時に返ってくる Nothing には .Row プロパティを付けることができず、もしその文字列が存在しなかったらエラーになるからです。

部分一致検索を行う

次に、文字列の一部分が一致するものを検索する部分一致検索について解説します。画像のようにセルに文字列を入れて、下のサンプルコードを実行してみましょう。

【サンプルコード】

Sub FindSample2()
    Dim src As Range
    Dim txt As String
    Dim srcObj As Range
    txt = "テックマニア"
    Set src = Range("A1:A4")
    Set srcObj = src.Find(txt, LookIn:=xlValues, LookAt:=xlPart)
    If Not srcObj Is Nothing Then
        MsgBox "'" & txt & "'は" & srcObj.Row & "行目にあります"
    Else
        MsgBox "'" & txt & "'はありませんでした"
    End If
End Sub

【実行結果】

完全一致検索との違いは、引数 LookAt に xlPart を代入しているという点です。この設定によって、セルの値の一部に指定した文字列や数式が含まれているかどうかを調べる部分一致検索ができます。

上のサンプルコードの LookAt を xlWhole に変更することで同じセルの値・一致条件で完全一致検索を行った場合は、「テックマニア」という文字列に一致するセルがないため「’テックマニア’はありませんでした」という表示になります。

条件に一致する値が見つからなかった場合の注意点

完全一致検索の項目で少し触れましたが、 Find メソッドで検索を行った結果、条件に一致する値が見つからなかった場合は Nothing という特殊な値が返ってきます。

Nothing はオブジェクト変数が何もオブジェクトを参照していない状態を示すものなので、通常のオブジェクトのようなプロパティは持っていません。その状態で上のサンプルコードのように Row プロパティを使用すると、存在しないプロパティを参照しようとしてエラーになります。

そのため、 Find メソッドを使用する際は検索結果が見つからない場合を想定して、 Nothing が返ってくるかどうかを IF ステートメントで分けるなど、エラーが発生しないように一工夫する必要があります。

【FindNext】次のセルに続けて検索する

実際にセルの検索を行うとき、検索結果が一つになるとは限りません。その場合は、 FindNext メソッドを使用することで、検索条件に当てはまる次のセルを続けて検索することができます。

FindNext メソッドの使い方は以下のとおりです。

【基本構文】

Range.FindNext(After)

Range はRangeオブジェクトを表しています。 After は検索開始する手前のセルの位置を表します。 FindNext メソッドでは、 After で指定した位置の次のセルから検索を継続します。

検索の条件は Find メソッドで指定した条件を引き継ぎます。そのため、 What などの検索条件を引数で指定する必要はありません。

【サンプルコード】

Sub FindSampleNext()
    Dim src As Range
    Dim txt As String
    Dim srcObj As Range
    txt = "テックマニア"
    
    Set src = Range("A1:A12")
    Set srcObj = src.Find(txt, LookAt:=xlPart)
    If srcObj Is Nothing Then
        MsgBox "'" & txt & "'はありませんでした"
        Exit Sub
    End If
    
    Dim dialog As String
    Dim c As Range
    Set c = srcObj
    Do
      dialog = dialog & "'" & txt & "'は" & c.Row & "行目にあります" & vbCrLf
      Set c = src.FindNext(c)
    Loop While c.Row <> srcObj.Row
    
    MsgBox dialog
End Sub

【実行結果】

上のサンプルコードでは、まず Find メソッドを使用して「テックマニア」という文字列を検索します。 引数 LookAt に xlPart を代入しているので、「テックマニア」を含む文字列を検索する部分一致検索になります。

複数のセルが条件に該当するので、 FindNext メソッドを使用して該当したセルの次から順番に検索を続けていくように設定します。

指定した範囲内で検索を続けるためには反復処理が必要になるので、 Do … Loop While ステートメントを使用して繰り返し検索します。不等号の「<>」は「A <> B」と書いて「AはBではない(A≠B)」を表します。

よって、ここでは「FindNext で該当したセルが最初に Find の検索で該当したセルと同一ではない」という条件に当てはまるときだけループが繰り返されます。これにより、最初に該当したセルと同じところに行きついたら処理が終了します。

【FindPrevious】前のセルに続けて検索する

先ほどは FindNext メソッドで次のセルを連続で検索していく方法を解説しました。

実際の業務では、複数のセルを検索する際に、検索方向を指定したい!という場合もありますよね。

そこで、次は Find メソッドで検索したセルの前のセルに移動して検索を続けていく FindPrevious メソッドを使用します。

【サンプルコード】

Sub FindSamplePrev()
    Dim src As Range
    Dim txt As String
    Dim srcObj As Range
    txt = "テックマニア"
    
    Set src = Range("A1:A12")
    Set srcObj = src.Find(txt, LookAt:=xlPart, SearchDirection:=xlPrevious)
    If srcObj Is Nothing Then
        MsgBox "'" & txt & "'はありませんでした"
        Exit Sub
    End If
    
    Dim dialog As String
    Dim c As Range
    Set c = srcObj
    Do
      dialog = dialog & "'" & txt & "'は" & c.Row & "行目にあります" & vbCrLf
      Set c = src.FindPrevious(c)
    Loop While c.Row <> srcObj.Row
    
    MsgBox dialog
End Sub

【実行結果】

FindNext の例で使用したコードのうち、 FindNext メソッドを FindPrevious に変更することで前のセルに移動して検索することができます。

ここでは、最初の Find メソッドで引数 SearchDirection の値を xlPrevious に設定することで、最初の検索も逆方向に検索を行っています。

【OR検索】複数の条件のどれかに当てはまるものを検索する

Excelで作業しているとき、検索するキーワードや数式がいつも1つだけとは限りませんよね。そこで、 Find メソッドを使用して複数の条件のうちどれか1つ以上に当てはまるものを検索するOR検索の実装方法について解説していきます。

Find メソッドで指定することができる文字列の数は、引数 What に代入できる1つだけになります。そのため、OR検索を実装するためには IF ステートメントで条件分岐を作り、複数の条件の1つずつを Find で検索していきます。

【サンプルコード】

Sub ORSearch()
    Dim r As Range
    Dim Obj As Range
    Dim kw1 As String, kw2 As String
    Dim dialog As String
    kw1 = "テック"
    kw2 = "編集部"
    
    For i = 1 To 12
        Set r = Range("A" & i)
        Set Obj = r.Find(kw1, LookAt:=xlPart)
        If Obj Is Nothing Then
        Else
            dialog = dialog & "'" & kw1 & "'は" & r.Row & "行目にありました" & vbCrLf
        End If
        
        Set Obj = r.Find(kw2, LookAt:=xlPart)
        If Obj Is Nothing Then
        Else
            dialog = dialog & "'" & kw2 & "'は" & r.Row & "行目にありました" & vbCrLf
        End If
    Next i
    
    If dialog = "" Then
        MsgBox "'" & kw1 & "'と" & kw2 & "のどちらも見つかりませんでした"
    Else
        MsgBox dialog
    End If
End Sub

【実行結果】

上のコードでは、検索範囲のセル数に応じて For ステートメントで繰り返して検索を行っています。

2つの検索条件となるキーワードを設定し、当てはまるものがない場合は何もせず次のセルへ送り、見つかった場合は MsgBox でダイアログを表示するようにしています。

最後に、どちらの条件にも当てはまるものがなかった場合のダイアログの表示を設定しています。

【AND検索】複数の条件全てに当てはまるものを検索する

OR検索について解説しましたので、続いては複数の条件全てに当てはまるAND検索の実装方法についても解説していきます。

ここでは、2つのキーワードをどちらも含むセルをAND検索してみましょう。

【サンプルコード】

Sub ANDSearch()
    Dim r As Range
    Dim Obj As Range
    Dim kw1 As String, kw2 As String, dialog As String
    kw1 = "テック"
    kw2 = "編集部"
    
    Set r = Range("A1:A12")
    kw1 = "テック"
    kw2 = "編集部"
    Set Obj = r.Find(kw1, LookAt:=xlPart)
    
    If Obj Is Nothing Then
        MsgBox "'" & kw1 & "'と" & kw2 & "'の両方を含むセルは見つかりませんでした"
        Exit Sub
    End If
    
    Dim c As Range
    Set c = Obj
    Do
        If InStr(c.Value, kw2) <> O Then
            dialog = dialog & "'" & kw1 & "'と" & kw2 & "'は" & c.Row & "行目にあります" & vbCrLf
        End If
        Set c = r.FindNext(c)
    Loop While c.Row <> Obj.Row
    
    If dialog = "" Then
        MsgBox "'" & kw1 & "'と" & kw2 & "'の両方を含むセルは見つかりませんでした"
    Else
        MsgBox dialog
    End If
End Sub

【実行結果】

AND検索ではどちらかが当てはまらない場合は該当しないので、まずは1つめの条件に当てはまらない場合を IF ステートメントで処理します。

次に、AND検索で合致する条件を InStr 関数で指定し、 Do … Loop While ステートメントで反復して処理します。

InStr 関数は2つの文字列を引数に取り、1つめの文字列に2つめの文字列が含まれている場合はその位置を値として返し、含まない場合は0を返します。

そのため、 InStr 関数の返り値が0ではない場合はAND検索の条件に当てはまると見なされ、 MsgBox でダイアログを表示します。

検索した文字列を他の文字列に置き換える方法を解説

Find を使用して検索した文字列を、一括で他の文字列に置き換えたい場合もあると思います。

ExcelではCtrl+Hを押して出てくる検索ボックスの置換機能でも文字列を置き換えることができますが、VBAを使うことで、先ほど解説したOR検索やAND検索などの条件を組み合わせた複雑な置換処理が可能になります。

実際に、文字列を検索して他の文字列に置換する方法をサンプルコードで解説していきます。

【サンプルコード】

Sub FindReplace()

    Dim c As Range
    Dim firstAddress As String
    Dim keyword As String
    Dim replaceText As String

    keyword = "てっくまにあ"
    replaceText = "TECH MANIA"

    With Worksheets(1).Range("A1:A12")
        Set c = .Find(keyword, LookIn:=xlValues)
        If Not c Is Nothing Then
            firstAddress = c.Address
            Do
                c.Value = Replace(c.Value, keyword, replaceText)
                Set c = .FindNext(c)
            Loop While Not c Is Nothing
            MsgBox "全ての'" & keyword & "'を'" & replaceText & "'に置き換えました。"
        Else
            MsgBox "該当する文字列が見つかりませんでした。"
        End If
    End With

End Sub

【実行前の状態】

【実行結果】

セルの値を書き換えるときには、検索したセルの Value プロパティを参照します。

ここでは、 Replace 関数を使って文字列を置き換えています。 Replace 関数は以下のような書き方で使用します。

【基本構文】

Replace(文字列の全文, 置換前の文字列, 置換後の文字列)

また、 このコードでは With ステートメントを使用してオブジェクトの参照を繰り返し行わなくても良くなるようにしています。こうすることで、コードが簡潔に書きやすく、エラーの発生も防ぎやすくなります。

なお、検索した文字列が存在するかどうかで If ステートメントを使って条件分岐をするときは、検索したセルが Nothing にならない場合を条件に指定することで、検索した文字列が存在する場合の処理を先に書くことができ、処理のロジックが分かりやすくなります。

まとめ

ここまでで Find メソッドの使い方について解説してきました。

Find メソッドを使用すると、Excelの検索ボックスでは実現できない複雑な検索や複数の文字列の検索、一括置換などができるようになります。

Find メソッドを使いこなして、Excelでの作業の効率化を実現していきましょう!

関連記事

VBAの勉強方法は?

書籍やインターネットで学習する方法があります。昨今では、YouTubeなどの動画サイトやエンジニアのコミュニティサイトなども充実していて多くの情報が手に入ります。
そして、より効率的に知識・スキルを習得するには、知識をつけながら実際に手を動かしてみるなど、インプットとアウトプットを繰り返していくことが重要です。特に独学の場合は、有識者に質問ができたりフィードバックをもらえるような環境があると、理解度が深まるでしょう。

ただ、VBAに限らず、ITスキルを身につける際、どうしても課題にぶつかってしまうことはありますよね。特に独学だと、わからない部分をプロに質問できる機会を確保しにくく、モチベーションが続きにくいという側面があります。独学でモチベーションを維持する自信がない人にはプログラミングスクールという手もあります。費用は掛かりますが、その分スキルを身につけやすいです。しっかりと知識・スキルを習得して実践に活かしたいという人はプログラミングスクールがおすすめです。

プログラミングスクールならテックマニアがおすすめ!

ITスキル需要の高まりとともにプログラミングスクールも増えました。しかし、どのスクールに通うべきか迷ってしまう人もいるでしょう。そんな方にはテックマニアをおすすめします!これまで多くのITエンジニアを育成・輩出してきたテックマニアでもプログラミングスクールを開講しています。

<テックマニアの特徴>
・たしかな育成実績と親身な教育 ~セカンドキャリアを全力支援~
・講師が現役エンジニア ~“本当”の開発ノウハウを直に学べる~
・専属講師が学習を徹底サポート ~「わからない」を徹底解決~
・実務ベースでスキルを習得 ~実践的な凝縮カリキュラム~

このような特徴を持つテックマニアはITエンジニアのスタートラインとして最適です。
話を聞きたい・詳しく知りたいという方はこちらからお気軽にお問い合わせください。

     

Otherカテゴリの最新記事