Categories: VBA基礎

EXCEL VBA セルの検索(完全一致・部分一致・複数一致)「Find・FindNextメゾット」の使い方

 

EXCEL VBA セルの検索(完全一致・部分一致・複数一致)「Find・FindNextメゾット」の使い方

 

 

●はじめに
EXCELで作成したデータから該当する文字列などを検索する時に、便利な機能としてFindメゾットがあります。Findメゾットの引数は、(What,After,LookIn,LookAt,SearchOrder,
SearchDirection,MatchCase,MatchByte,SearchFormat)全部で9種類(下記参照)の引数が用意されており、Findメゾットを利用すれは、複雑な条件設定や完全一致・部分一致・複数一致など、様々な検索方法を扱う事が出来ます。それでは、Findメゾットの利用方法を順番に説明いたします。

 

 

●書式の説明 (Findメゾット)
Set オフジェクト変数 = セル範囲.Find(What,After,LookIn,LookAt,SearchOrder,
SearchDirection,MatchCase,MatchByte,SearchFormat)

 

引数定数説明
What検索する文字列を指定します。ワイルドカードも可能です。
After検索を開始するセルを指定します。指定しない場合は、セル範囲してした一番左うえから検索を開始します。
LookInxlVaues(値)
xlFormulas(数式)
xlComments(コメント)
セルの値のみを検索するか、数式や関数の文字を検索するかを指定します。
LookAtxlWhole(完全一致)
xlPart(部分一致)
検索値に対して、完全一致又は、部分一致を指定します。
SearchOrderxlByRows(行方向)
xlByColumns(列方向)
行方向又は、列方向どちらを優先的に検索するかを指定します。
SearchDirectionxlNext(前方向)
xlPrevious(後方向)
検索する方向を指定します。
MatchCaseTrue(区別する)
False(区別しない)
大文字と小文字を区別するかを指定します。
MatchByteTrue(区別する)
False(区別しない)
文字の全角と半角を区別するか指定します。
SearchFormatTrue(オン)
False(オフ)
書式検索をオンにするかを指定します。

 

 

 

検索条件:部分一致「指定した文字列を検索」(Findメゾット)

 

 

●プログラム説明 (サンプルプログラム①)
(画面クリックして拡大)

下記のプログラムは、下表のデータからFindメゾットを使ってD列「住所」の中から検索文字として「東京」に部分一致する行番号を返すプログラムです。

 

 

Sub Find00() '住所一部検索


    Dim MyData, HitData As Range
    Dim SerachAdd As String
    
    
    Set MyData = Range("D2:D20") '検索範囲を指定「D列:住所」
    
    SerachAdd = "東京"  '検索文字として指定
    
    Set HitData = MyData.Find(What:=SerachAdd, lookat:=xlWhole) 'D列「住所」の中から検索文字「東京」の部分一致(xlPart)で検索します。

    
    If HitData Is Nothing Then    '検索文字が無ければ、「該当データはありません」っと表示してプログラムを終了します。
            MsgBox "該当データはありません"
            Exit Sub
    End If
    
    MsgBox "該当セルは" & HitData.Row - 1 & "行目にあります。"  '検索文字が発見された行がメッセジーボックスとして表示されます。
    
    
    
End Sub

 

 

●実行前~実行後 ※プログラム実行後、検索文字として「東京」(部分一致)を指定してD列「住所」を検索しましたので、該当する「東京」の文字列が含まれている行番号が表示されました。
(画面クリックして拡大)

 

 

 

検索条件:完全一致「指定した文字列を検索」(Findメゾット)

 

 

 ●プログラム説明 (サンプルプログラム②)
(画面クリックして拡大)
下記のプログラムは、下表のデータからFindメゾットを使ってB列「名前」の中から指定する検索文字を入力して、入力文字と完全一致したB列「名前」の背景色を塗りつぶすプログラムです。

 

 

Sub Find01() '名前検索


    Dim MyData, HitData As Range
    Dim SerachName As String
    Dim lRow As Long
    
    
    Do
    
        SerachName = InputBox("名前を入力して下さい。")  '検索値(名前)を入力

    Loop Until SerachName <> "" '名前が入力されたか確認
    
    
    lRow = Cells(Rows.Count, "A").End(xlUp).Row 'A列の最終行を取得
    
    
    Set MyData = Range("B2:B" & lRow) '検索範囲を指定
    Set HitData = MyData.Find(What:=SerachName, lookat:=xlPart) '検索範囲から検索値を検索する。

    
    If HitData Is Nothing Then  '検索範囲から検索結果があるか確認する。
            MsgBox "該当データはありません"
            Exit Sub
    End If
    
    Range("B" & HitData.Row).Interior.ColorIndex = 6   '検索された該当する名前の背景色を塗りつぶす。
    
    
End Sub

 

 

 ●実行前~実行後 ※プログラム実行後、今回は、完全一致で検索しますので、メッセージボックスが表示されるので正確に「東 梨華」を入力します。B列の「名前」から完全一致する入力した検索文字を検索します。完全一致する名前が検索されたら該当のセルの背景色が塗りつぶされます。
(画面クリックして拡大)

 

 

 

検索条件:複数一致・複数条件「指定した文字列を検索」(Findメゾット)

 

 

●プログラム説明 (サンプルプログラム③)
(画面クリックして拡大)
下記のプログラムは、下表のデータからFindメゾットを使って「名前」と「住所」の中から指定する検索文字を入力して、入力文字と部分一致したB列「名前」とD列「住所」の背景色を塗りつぶし、検索結果「G列」に検索件数を記述するサンプルプログラムです。

 

Sub Find() '複数検索


    Dim NameData, AddData, HitName, HitAdd As Range
    Dim SerachName, SerachAdd As String
    Dim lRow, I, NameCnt, AddCnt As Long
    
    
    Do
    
        SerachName = InputBox("名前を入力して下さい。")  '検索値(名前)を入力

        SerachAdd = InputBox("都道府県名を入力して下さい。")  '検索値(住所)を入力
        
    Loop Until SerachName <> "" And SerachAdd <> ""  '名前と都道府県名(文字)が入力されたか確認・入力されるまで繰り返す
    
    
    
    lRow = Cells(Rows.Count, "A").End(xlUp).Row 'A列の最終行を取得
    
    
    For I = 2 To lRow  '2行目から最終行まで繰り返す。
    
        Set NameData = Range("B" & I & ":B" & I) '検索範囲を指定(名前)
        Set HitName = NameData.Find(What:=SerachName, Lookat:=xlPart) '検索範囲から検索値(名前:xlPart 部分一致)を検索する。
    
        Set AddData = Range("D" & I & ":D" & I) '検索範囲を指定(住所)
        Set HitAdd = AddData.Find(What:=SerachAdd, Lookat:=xlPart) '検索範囲から検索値(住所:xlPart 部分一致)を検索する。
        
        If HitName Is Nothing Then
            Else
                Range("B" & HitName.Row).Interior.ColorIndex = 7   '検索された該当する名前の背景色を塗りつぶす。
                NameCnt = NameCnt + 1
        End If
        
        If HitAdd Is Nothing Then
            Else
                Range("D" & HitAdd.Row).Interior.ColorIndex = 6   '検索された該当する住所の背景色を塗りつぶす。
                AddCnt = AddCnt + 1
        End If
    
    Next I
    
    Range("G2") = NameCnt '検索された名前の件数を代入
   
    Range("G3") = AddCnt '検索された住所の件数を代入
        
End Sub

 

 

●実行前~実行後 ※プログラム実行後、今回のプログラムは、名前と住所(都道府県名)の複数条件に対応するプログラムです。入力画面で「名前」は、「田」を指定・「都道府県名」は、「大阪」を指定します。部分一致で検索しますので、「名前」に「田」が含まれているものと「都道府県名(住所)」に「大阪」が含まれているデータに対して、該当するセルの背景色が塗りつぶしされて、該当する件数をカウントして、「検索結果」としてG列に件数を表示します。
(画面クリックして拡大)

 

 

検索条件:複数一致「指定した文字列を検索」(FindNextメゾット)

 

 

●プログラム説明 (サンプルプログラム④)
(画面クリックして拡大)

下記のプログラムは、下表のデータからFindNextメゾットを使って「血液型」の中から指定する血液型を入力して、入力文字「A」と完全一致したE列「血液型」の背景色を塗りつぶすサンプルプログラムです。今回は、FindNextを使って連続的に検索をする仕組みになっています。

 

 

Sub FindNext() '複数結果

    Dim RData, HitBL As Range
    Dim SerachBl As String
    Dim lRow, i As Long
        
    Do
        SerachBl = InputBox("血液型を入力")  '検索値(血液型)を入力
        
    Loop Until SerachBl <> ""  '性別と血液型(文字)が入力されたか確認・入力されるまで繰り返す
    
    
    lRow = Cells(Rows.Count, "A").End(xlUp).Row 'A列の最終行を取得

  
    Set RData = Range("E2:E" & lRow) '検索範囲を指定
    
    Set HitBL = RData.Find(What:=SerachBl, Lookat:=xlWhole) '検索範囲から検索値(血液型:xlWhole 完全一致)を検索する。
        
    If HitBL Is Nothing Then
                MsgBox "検索データがありません"
                Exit Sub
            Else
                Range("E" & HitBL.Row).Interior.ColorIndex = 6   '検索された該当する住所の背景色を塗りつぶす。
        
    End If
    
    For i = 2 To lRow  '2行目から最終行まで繰り返す。
           
        Set HitBL = RData.FindNext(HitBL) '検索範囲から検索値(血液型:xlWhole 完全一致)を検索する。「次の検索」
        
        If HitBL Is Nothing Then
            Else
                Range("E" & HitBL.Row).Interior.ColorIndex = 6   '検索された該当する住所の背景色を塗りつぶす。
        
        End If
    
    Next i
       
End Sub

 

 

●実行前~実行後 ※プログラム実行後、血液型を入力(A)を入力して、E列(血液型)に該当するセルの背景色が塗りつぶされました。
(画面クリックして拡大)

 

 

最後まで、ご覧いただきまして誠に有難うございました。
また、VBAに関するテクニックや便利な手法などをこのサイトに掲載していきますので、定期的に参照していただけると幸いです。

 

AKIRA