Excel VBA: How to save filters applied to ListObject for re-using them later
This solution is meant for Excel versions officially supported in time of writing (01/2021).
If you need compatibility with old (already unsupported) Excel versions see answer in: In Excel VBA, how do I save / restore a user-defined filter? by @PhilSpencer
Public Function SavedTableFilters(ByVal Table As ListObject) As Variant
Dim ColumnCount As Long
ColumnCount = Table.ListColumns.Count
Dim SavedFilter() As SavedFilter
ReDim SavedFilter(1 To ColumnCount)
Dim i As Long
For i = 1 To ColumnCount
Dim Filter As Filter
Set Filter = Table.AutoFilter.Filters.Item(i)
'Save only filters which are On
If Filter.On Then
Set SavedFilter(i) = New SavedFilter
With SavedFilter(i)
.Criteria1 = Filter.Criteria1
.Operator = Filter.Operator
On Error Resume Next 'Error handling (if error skip to next line)
.Criteria2 = Filter.Criteria2
If Err.Number <> 0 And Err.Number <> 1004 Then
'Code what to do if other error than 1004 is thrown
End If
On Error GoTo 0 'Re-set to default
End With
End If
Next i
SavedTableFilters = SavedFilter()
End Function
The trick is done by
-
"ignoring" errors in code
On Error Resume Nextwhile accessingFilter.Criteria2. -
All errors are "ignored" after
On Error Resume Next, this is why there isIf Err.Number <> 0 And Err.Number <> 1004which is true in case of other error. -
On Error GoTo 0is return to default behavior
The first idea was to decide if to even access Filter.Criteria2 based on Filter.Operator value, but I'm not sure if it is reliable.
Related videos on Youtube
Lluser
Updated on December 26, 2022Comments
-
Lluser 5 monthsduring my procedure I want to remove all filters applied to
ListObject, do something else and then re-apply these filters back.I'm struggling in the first step - save filter settings.
ListObject.AutoFIlter.Filtersis a collecton object whereItemisFilterobject. I want to store properties of these filters and re-use, but gettingRun-time error '1004'It's because Filter property
Criteria2is usually not set and has value:<Application-defined or object-defined error>. As you can see in an image below:Code in a module
Public Sub FilterManupulation() Dim Table As ListObject '... 'save filters Dim Saved As Variant Saved = SaveTableFilters(Table) '... 'disable filters call Table.AutoFilter.ShowAllData '... End SubFunction code
Public Function SaveTableFilters(ByVal Table As ListObject) As Variant Dim ColumnCount As Long ColumnCount = Table.ListColumns.Count Dim SavedFilter() As SavedFilter 'SavedFilter is custom Class ReDim SavedFilter(1 To ColumnCount) 'Set array size acc. to column count Dim i As Long For i = 1 To ColumnCount Dim Filter As Filter Set Filter = Table.AutoFilter.Filters.Item(i) 'Save only filters which are On If Filter.On Then Set SavedFilter(i) = New SavedFilter With SavedFilter(i) .Criteria1 = Filter.Criteria1 .Criteria2 = Filter.Criteria2 'This throws Run-time error '1004' .Operator = Filter.Operator End With End If Next i SavedTableFilters = SavedFilter() End FunctionSavedFilterClass Module codePublic Criteria1 As Variant Public Criteria2 As Variant Public Operator As XlAutoFilterOperatorThanks for suggestions.
-
Steve about 8 yearsWhat model of laptop do you have Rodney? This will help us find the drivers for you. -
Tim Williams over 2 years -
Lluser over 2 yearsThank you @TimWilliams, this helps. (I already saw it before, but consider it - based on top rated answer - obsolete. My bad.
-