Excel VBA(マクロ)で部分一致検索条件にヒットするデータを全て列挙する方法

IT

マクロを実行すると、データ内の該当する項目が全部縦に並べられる、というマクロです。コピペ可です。

スポンサーリンク

成果物

find 全て vba 1
Sheet2にはこのようにデータが並んでおり、
find 全て vba 2
Sheet1では検索窓にデータを打ち込めます。
find 全て vba 3
マクロを実行すると、部分一致する検索対象が全て表示されます。
' vba
Sub 部分一致検索()

    '検索結果を書き込むセル
    Dim sht1 As Range
    Dim sht1cnt As Integer
    sht1cnt = 2
    Set sht1 = Sheets("Sheet1").Cells(sht1cnt, 1)

    '検索内容
    Dim wht As String
    
    '検索内容の取得
    wht = Sheets("Sheet1").Cells(1, 1).Value
    
    'Sheet1の前の検索結果をクリア
    Sheets("Sheet1").Range("A2:A1000").ClearContents

    '検索用
    Dim foundCell As Range
    Dim firstCell As Range
    
    Set foundCell = Sheets("Sheet2").Range("A:A").Find(What:=wht, lookat:=xlPart)
    
    If foundCell Is Nothing Then ' 見つからない場合①
    MsgBox "検索条件に合うものが見付かりません"
    
    Else
    
        sht1.Value = foundCell.Value
        sht1cnt = sht1cnt + 1
        Set sht1 = Sheets("Sheet1").Cells(sht1cnt, 1)

        '最初の検索結果をfirstCellとして保存
        Set firstCell = foundCell
        
        '同じ条件で続けて検索(ループ)
        Do
            Set foundCell = Sheets("Sheet2").Range("A:A").FindNext(After:=foundCell)
            
            If foundCell Is Nothing Then ' 見つからない場合②
                Exit Do ' ループ終了
            End If ' 見つからない場合②の終わり
            
            '最初の検索結果と現在の検索結果が同じ場合アドレスを表示しない
            If foundCell.Address <> firstCell.Address Then
                sht1.Value = foundCell.Value
                sht1cnt = sht1cnt + 1
                Set sht1 = Sheets("Sheet1").Cells(sht1cnt, 1)
            End If
            
        '最初の検索結果=現在の検索結果の場合ループ終了
        Loop Until foundCell.Address = firstCell.Address
    End If ' 見つからない場合①の終わり

End Sub

解説(ざっくり)

' vba
Set foundCell = Sheets("Sheet2").Range("A:A").Find(What:=wht, lookat:=xlPart)
通常の検索に加えて、LookAtをxlPartに設定することで部分一致検索にしています。
その他プロパティでいくつか細かい調整が可能です。
' vba
Set foundCell = Sheets("Sheet2").Range("A:A").FindNext(After:=foundCell)
FindNextは前のFindの設定を引き継いで再度検索することができるメソッドです。
一周すると自動で止まる、みたいな機能は残念ながらないので、そこは条件で判定させています。

関連項目も表示させる(VlokUp)

find 全て vba 4
ついでに、もし関連項目がある場合、
find 全て vba 5
この例で言えば、Sheet1のB列に=IfError(VlookUp($A2,Sheet2!$A:$C,Column(),FALSE),"")と記入して、
find 全て vba 6
オートフィルで延ばすことで一緒に表示させることができます。
Excel(エクセル):検索、置換
検索・置換関連の操作、関数、VBAまとめです。 検索・置換操作 検索の基本 検索をするには、ホームタブの右端あたりにある、 検索と選択から検索をクリックします。 検索画面を起動 Ctrl+F またはショート...
やりたいことから方法を探すエクセル(Excel)操作・関数・VBA(マクロ)逆引きまとめ
逆引き(やりたいことから探す)Excel記事まとめ

コメント