ユーザーフォーム コンボボックスを使って自動フィルタリングVBA

ユーザーフォーム コンボボックスを使って自動フィルタリングVBA-アイキャッチ ExcelVBA

ユーザーフォームのコンボボックスとテキストボックスを活用して、VBAで効率的なデータフィルタリングを実現する方法を紹介します。

ぜひお試しください😉

ユーザーフォーム作成

ユーザーフォームを作成します。


 

Excelシート概要

A列に「日付」、B列に「商品名」を入力しておきます。


 
 

Excelシートにマクロボタン設置

「Sheet1」にマクロボタンを設置します。


 

以下コードを標準モジュール「Module1」に入力して、
ボタンをクリックしたときに、ユーザーフォームが開くようにします。


Sub ボタン1_Click()
    UserForm1.Show vbModeless
End Sub

 

マクロコードを「Module1」に入力した画面


 
 

マクロコードを入力

マクロコードを「UserForm1」に入力します。


Option Explicit

Private Sub CommandButton1_Click()

    Dim filterDate As String
    Dim filterItem As String
    Dim visibleRows As Long
    Dim rng As Range
    Dim Row As Range
    
    filterDate = TextBox1.Text
    filterItem = ComboBox1.Value

  ' Sheet1に対して操作を行う
    With Sheet1
        ' オートフィルターが有効な場合はオフ
        .AutoFilterMode = False
        ' A列から最終行までをフィルタリングの範囲として設定
        .Range("A1:B" & .Cells(.Rows.Count, "A").End(xlUp).Row).AutoFilter
        
        ' テキストボックスから入力された日付でフィルタリング
        If IsDate(filterDate) Then
            .Range("A1:B" & .Cells(.Rows.Count, "A").End(xlUp).Row).AutoFilter Field:=1, Criteria1:=filterDate
        End If
        
        ' コンボボックスから選択された商品名でフィルタリング
        If filterItem <> "" Then
            .Range("A1:B" & .Cells(.Rows.Count, "A").End(xlUp).Row).AutoFilter Field:=2, Criteria1:=filterItem
        End If
        
        ' フィルタリング後の可視セルの数を数える
        Set rng = .AutoFilter.Range
        On Error Resume Next ' エラーを無視する
        ' フィルタリングされた範囲内のすべての表示されている行をカウント
        visibleRows = 0
        If rng.Columns(1).SpecialCells(xlCellTypeVisible).Count > 1 Then
            For Each Row In rng.Rows
                If Row.EntireRow.Hidden = False Then
                    visibleRows = visibleRows + 1
                End If
            Next Row
        End If
        ' ヘッダー行を除外するために1を減算
        visibleRows = visibleRows - 1
        On Error GoTo 0 ' エラーハンドリングを元に戻す
        
        ' 結果のメッセージを表示
        If visibleRows > 0 Then
            MsgBox visibleRows & "件のデータが見つかりました。", vbInformation, "検索結果"
        Else
            MsgBox "条件に一致するデータはありませんでした。", vbExclamation, "検索結果"
        End If
    End With
End Sub

Private Sub UserForm_Initialize()
'ユーザーフォームが初期化されるときの処理を定義
    Dim dictItems As Object
    Dim cell As Range

    ' 辞書オブジェクトを作成し、重複を避ける
    Set dictItems = CreateObject("Scripting.Dictionary")

    ' B列の商品名を読み込む
    For Each cell In Sheet1.Range("B2:B" & Sheet1.Cells(Sheet1.Rows.Count, "B").End(xlUp).Row)
        If Not dictItems.exists(cell.Value) And Not IsEmpty(cell.Value) Then
            ComboBox1.AddItem cell.Value
            dictItems.Add cell.Value, Nothing
        End If
    Next cell
End Sub

 

マクロコードを入力する場所「UserForm1」


 

動作

TextBox1 に希望する「日付」を手入力します。
日付は「年/月/日」の形式で入力してください。

次に、ComboBox1 からフィルタリングしたい「商品名」を選択します。
これらの入力が完了したら、「実行」ボタンをクリックします。

指定された日付と商品名に基づいて、データがフィルタリングされます。


 

複数の該当データが存在する場合でも、フィルタリングできます。


 

入力した日付・商品名に該当するデータが存在しない場合は、
「条件に一致するデータはありませんでした」というメッセージが表示されます。


 
 
この記事がお役に立ちますと幸いです🍀
 
・【ExcelVBA】ユーザーフォーム作成の事例まとめ
 

【VBAユーザーフォーム】何ができるの?:使用例34選
...

 

「今すぐ使えるかんたんmini Excel マクロ&VBAの基本と便利がこれ1冊でわかる本」
基礎から応用まで丁寧に解説されており、VBAの初心者も安心して学ぶことができる
実務に直結する便利なワザを豊富に紹介。日々の業務を効率化する技術が満載!