ユーザーフォームのコンボボックスとテキストボックスを活用して、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の初心者も安心して学ぶことができる
実務に直結する便利なワザを豊富に紹介。日々の業務を効率化する技術が満載!
リンク