Sorry, te weinig reacties om commentaar te geven. (Admins, voel je vrij om dit in een commentaar hierboven te knippen.) Reactie van gebruiker “danicotra” beginnend met “Ik gebruik ook een VBA/Macro gebaseerd op Worksheet_Change event, maar mijn aanpak…” met
‘ eerst filter verwijderen
’ dan weer toepassen
is de juiste oplossing bij gebruik van Excel 2007+. Maar .AutoFilter.ApplyFilter is ongeldig in XL03 en eerder, dus ik laat de onderstaande manier zien.
Ik smeek dat echte experts en goeroes de code lezen want ik ben er vrij zeker van dat het materiaal van de bovenste plank is. Misschien kan het onverklaarbare aantal downvote’s op dit antwoord worden teruggedraaid als mensen zien wat voor goed spul hieronder wordt gedaan.
danicotra gebruikte een vereenvoudigd voorbeeld. Eigenlijk kun je dit algemener doen. Ga uit van Met ActiveSheet voor het volgende (of een ander sheetobject):
Sla het bereik van het autofilter op. Het heeft .AutoFilter.Filters.Count kolommen, en (.AutoFilter.Range.Count/.AutoFilter.Filters.Count) rijen, opgeslagen in rngAutofilter
Verzamel in een array myAutofilters elk van de 4 eigenschappen van elk van de .AutoFilter.Filters.Count autofilter items, waarbij u ervoor moet zorgen dat u “Application-defined errors” vermijdt wanneer .On of .Operator false is. (mijnAutofilters zou worden geDim’d naar het aantal rijen en kolommen in stap 1)
Schakel het filter uit maar behoud de uitklapmenu’s met .ShowAllData
Voor elk filteritem dat .On was volgens uw opgeslagen matrix, reset u 3 van de 4 eigenschappen van elk van de .AutoFilter.Filters.Count autofilteritems. Zorg er opnieuw voor dat u “Toepassingsgedefinieerde fouten” vermijdt wanneer .Operator false is, dus voor elk item “i”,
rngAutofilter.AutoFilter Field:=i, Criteria1:=myAutofilters(i,2)
of
rngAutofilter. AutoFilter Field:=i, Criteria1:=myAutofilters(i,2), Operator:=myAutofilters(i,3), Criteria2:=myAutofilters(i,4)
Nu wordt het autofilter opnieuw ingesteld, over hetzelfde bereik als het was voordat uw code begon, maar met het autofilter bijgewerkt voor wijzigingen in de gegevens.
Public myAutofilters As Variant, rngAutofilter As Range 'Public
Sub SaveAndRestoreAutofilters()
'This will update the autofilter display to recognize data changes by turning autofilter off and then on, preserving all characteristics
'Note, XL2007 and later have .autofilter.applyfilter, but not the invaluable XL03 and earlier
Dim i As Long, iNumAutofilters As Long, iNumActiveAutofilters As Long
iNumActiveAutofilters = SaveAutoFilterInfo(iNumAutofilters) 'NOTE! Use CALL or assignment to prevent parentheses from forcing ByVal !
If iNumActiveAutofilters < 1 Then
Application.StatusBar = "0 ACTIVE filters;" & iNumAutofilters & " autofilters"
Exit Sub
End If
ActiveSheet.ShowAllData
Rem Here optionally do stuff which can include changing data or toggling autofilter columns
For i = 1 To iNumAutofilters
If myAutofilters(i, 1) Then
If myAutofilters(i, 3) <> 0 Then 'then .Operator is something, so set it and Criteria2, else just Criteria1
rngAutofilter.AutoFilter Field:=i, Criteria1:=myAutofilters(i, 2), Operator:=myAutofilters(i, 3), Criteria2:=myAutofilters(i, 4) ', On:=true by rule
Else
rngAutofilter.AutoFilter Field:=i, Criteria1:=myAutofilters(i, 2) ', On:=true by rule (it's R/O anyway)
End If
Rem Selection.AutoFilter Field:=i 'How you'd "turn off" only a single column's autofiltering. FYI .On is R/O!
End If
'activesheet.autofiltermode=false 'just FYI, how you comprehensively turn off filtering on a sheet (erasing the dropdowns and criteria and filter range!)
Next i
End Sub
Function SaveAutoFilterInfo(iNumAutofilters As Long) As Long
Dim i As Long, iRowsAutofiltered As Long
SaveAutoFilterInfo = 0 'counts the number that are .On, and returns the total
iNumAutofilters = ActiveSheet.AutoFilter.Range.Columns.Count
If ActiveSheet.AutoFilter.Filters.Count <> iNumAutofilters Then MsgBox "I can't explain this. All bets are off. Aborting.": Exit function
ReDim myAutofilters(1 To iNumAutofilters, 4)
For i = 1 To iNumAutofilters
myAutofilters(i, 1) = ActiveSheet.AutoFilter.Filters(i).On
If myAutofilters(i, 1) Then
SaveAutoFilterInfo = SaveAutoFilterInfo + 1
myAutofilters(i, 2) = ActiveSheet.AutoFilter.Filters(i).Criteria1
myAutofilters(i, 3) = ActiveSheet.AutoFilter.Filters(i).Operator
If myAutofilters(i, 3) <> 0 Then 'then is either xlAnd, xlOr, etc., and there's a second criteria
myAutofilters(i, 4) = ActiveSheet.AutoFilter.Filters(i).Criteria2
End If
End If
Next i
iRowsAutofiltered = ActiveSheet.AutoFilter.Range.Count / ActiveSheet.AutoFilter.Range.Columns.Count
Set rngAutofilter = Cells(ActiveSheet.AutoFilter.Range.Row, ActiveSheet.AutoFilter.Range.Column).Resize(iRowsAutofiltered, iNumAutofilters)
End Function