Dynamic Cell-Based Filter

Automatically filter table data based on values entered in specific cells with real-time updates and multiple filter criteria.

822 views

Perfect For:

  • Interactive dashboards
  • User-controlled filtering
  • Search interfaces
  • Dynamic reports
  • Data exploration tools
VBA Code
' Dynamic Cell-Based Filter
' Place this code in the Worksheet module where your data table exists
' Assumes data table starts at row 6, filter cells are C2 and H2

Private Sub Worksheet_Change(ByVal Target As Range)
    ' Trigger filter when C2 or H2 changes
    On Error GoTo ErrorHandler

    Dim filterCell1 As Range
    Dim filterCell2 As Range
    Set filterCell1 = Me.Range("C2")
    Set filterCell2 = Me.Range("H2")

    ' Check if changed cell is one of the filter cells
    If Not Intersect(Target, filterCell1) Is Nothing Or _
       Not Intersect(Target, filterCell2) Is Nothing Then

        Application.EnableEvents = False
        Call ApplyDynamicFilter
        Application.EnableEvents = True
    End If

    Exit Sub

ErrorHandler:
    Application.EnableEvents = True
    MsgBox "Error applying filter: " & Err.Description, vbCritical
End Sub

Sub ApplyDynamicFilter()
    ' Apply filters based on cell values
    On Error GoTo ErrorHandler

    Dim ws As Worksheet
    Set ws = Me

    Dim filterValue1 As String
    Dim filterValue2 As String

    filterValue1 = Trim(ws.Range("C2").Value)
    filterValue2 = Trim(ws.Range("H2").Value)

    ' Get the data table (assumes it starts at row 6)
    Dim dataTable As ListObject
    On Error Resume Next
    Set dataTable = ws.ListObjects(1)
    On Error GoTo ErrorHandler

    ' If table doesn't exist, create it
    If dataTable Is Nothing Then
        Dim lastRow As Long
        Dim lastCol As Long
        lastRow = ws.Cells(ws.Rows.Count, "B").End(xlUp).Row
        lastCol = ws.Cells(6, ws.Columns.Count).End(xlToLeft).Column

        Set dataTable = ws.ListObjects.Add(xlSrcRange, ws.Range(ws.Cells(6, 2), ws.Cells(lastRow, lastCol)), , xlYes)
        dataTable.Name = "DataTable"
    End If

    ' Clear existing filters
    If dataTable.AutoFilter.FilterMode Then
        dataTable.AutoFilter.ShowAllData
    End If

    ' Determine which filters to apply
    Dim applyFilter1 As Boolean
    Dim applyFilter2 As Boolean

    applyFilter1 = (filterValue1 <> "")
    applyFilter2 = (filterValue2 <> "")

    ' Apply filters based on which cells have values
    If applyFilter1 And applyFilter2 Then
        ' Both filters active
        ' Find column indices (B = 1, H = 7 in table context)
        Dim col1Index As Long
        Dim col2Index As Long
        col1Index = 1 ' Column B in table (first column)

        ' Find H column index in table
        Dim i As Long
        For i = 1 To dataTable.ListColumns.Count
            If dataTable.HeaderRowRange.Cells(1, i).Column = ws.Range("H6").Column Then
                col2Index = i
                Exit For
            End If
        Next i

        ' Apply both filters with wildcard matching
        dataTable.Range.AutoFilter Field:=col1Index, Criteria1:="=*" & filterValue1 & "*"
        If col2Index > 0 Then
            dataTable.Range.AutoFilter Field:=col2Index, Criteria1:="=*" & filterValue2 & "*"
        End If

    ElseIf applyFilter1 Then
        ' Only filter 1 active (column B)
        dataTable.Range.AutoFilter Field:=1, Criteria1:="=*" & filterValue1 & "*"

    ElseIf applyFilter2 Then
        ' Only filter 2 active (column H)
        ' Find H column index
        For i = 1 To dataTable.ListColumns.Count
            If dataTable.HeaderRowRange.Cells(1, i).Column = ws.Range("H6").Column Then
                col2Index = i
                Exit For
            End If
        Next i

        If col2Index > 0 Then
            dataTable.Range.AutoFilter Field:=col2Index, Criteria1:="=*" & filterValue2 & "*"
        End If
    End If

    ' If both filter cells are empty, show all data
    If Not applyFilter1 And Not applyFilter2 Then
        If dataTable.AutoFilter.FilterMode Then
            dataTable.AutoFilter.ShowAllData
        End If
    End If

    Exit Sub

ErrorHandler:
    MsgBox "Error applying dynamic filter: " & Err.Description, vbCritical
End Sub

Sub ClearFilters()
    ' Macro to clear all filters and filter cells
    On Error Resume Next

    Dim ws As Worksheet
    Set ws = ActiveSheet

    ' Clear filter input cells
    ws.Range("C2").ClearContents
    ws.Range("H2").ClearContents

    ' Remove filters from table
    Dim dataTable As ListObject
    Set dataTable = ws.ListObjects(1)

    If Not dataTable Is Nothing Then
        If dataTable.AutoFilter.FilterMode Then
            dataTable.AutoFilter.ShowAllData
        End If
    End If

    MsgBox "Filters cleared!", vbInformation
End Sub

Sub ShowFilteredCount()
    ' Display count of visible (filtered) rows
    On Error GoTo ErrorHandler

    Dim ws As Worksheet
    Set ws = ActiveSheet

    Dim dataTable As ListObject
    Set dataTable = ws.ListObjects(1)

    If dataTable Is Nothing Then
        MsgBox "No data table found.", vbExclamation
        Exit Sub
    End If

    Dim totalRows As Long
    Dim visibleRows As Long

    totalRows = dataTable.ListRows.Count
    visibleRows = dataTable.Range.SpecialCells(xlCellTypeVisible).Rows.Count - 1 ' Subtract header

    MsgBox "Showing " & visibleRows & " of " & totalRows & " rows", vbInformation, "Filter Results"

    Exit Sub

ErrorHandler:
    MsgBox "Error counting filtered rows: " & Err.Description, vbCritical
End Sub

Related Topics

filter dynamic cell-based real-time interactive

Need Custom VBA Solutions?

Our AI-powered VBA generator can create custom code tailored to your specific requirements in seconds.

Free AI generations every month — top up with credit packs anytime

Related Templates

More VBA templates in the same category

Beginner

Data Processing & Cleanup

Remove duplicates, clean data formats, and standardise entries

View Template
Intermediate

Timesheet & Attendance Tracker

Track employee working hours, overtime, absences, and holidays with automatic calculations, weekl...

View Template
Intermediate

Data Entry Form with Validation

Professional UserForm-based data entry system with field validation, dropdown lists, date pickers...

View Template