Entschuldigung, nicht genügend Mitarbeiter, um einen Kommentar abzugeben. (Admins, zögern Sie nicht, dies in einen Kommentar oben zu schreiben.) Die Antwort von "danicotra" des Benutzers beginnt mit "Ich verwende ein VBA / Makro, das auch auf dem Worksheet_Change-Ereignis basiert, aber meine Vorgehensweise ..." mit
"Erst Filter entfernen
" und dann anwenden Auch dies
ist die richtige Lösung, wenn Sie Excel 2007+ verwenden. .AutoFilter.ApplyFilter ist jedoch in XL03 und früheren Versionen ungültig, daher zeige ich den folgenden Weg.
Ich bitte echte Experten und Gurus, den Code zu lesen, da ich ziemlich sicher bin, dass es sich um erstklassiges Material handelt. Vielleicht kann die unerklärliche Anzahl der Abstimmungen in Bezug auf diese Antwort umgekehrt werden, wenn die Leute sehen, welche guten Dinge unten getan werden.
danicotra verwendete ein vereinfachtes Beispiel. Tatsächlich können Sie dies allgemeiner tun. Angenommen, mit ActiveSheet für Folgendes (oder ein anderes Blattobjekt):
Speichern Sie den Bereich des Autofilters. Es enthält .AutoFilter.Filters.Count-Spalten und (.AutoFilter.Range.Count / .AutoFilter.Filters.Count) -Zeilen, die in rngAutofilter gespeichert werden
Sammeln Sie in einem Array myAutofilters jede der 4 Eigenschaften der .AutoFilter.Filters.Count-Autofilter-Elemente, und achten Sie darauf, dass Sie "Anwendungsdefinierte Fehler" vermeiden, wenn .On oder .Operator falsch sind. (myAutofilters wird in Schritt 1 auf die Anzahl der Zeilen und Spalten umgestellt.)
Schalten Sie den Filter aus, aber bewahren Sie die Dropdowns mit .ShowAllData auf
Setzen Sie für jedes Filterelement, das Ihrem gespeicherten Array entspricht, 3 der 4 Eigenschaften jedes Autofilterelements zurück. Achten Sie erneut darauf, dass Sie "Anwendungsdefinierte Fehler" vermeiden, wenn .Operator false ist, und zwar für jedes Element "i":
rngAutofilter.AutoFilter Field: = i, Criteria1: = myAutofilters (i, 2)
oder
rngAutofilter.AutoFilter Field: = i, Criteria1: = myAutofilters (i, 2), Operator: = myAutofilters (i, 3), Criteria2: = myAutofilters (i, 4)
Jetzt wird der Autofilter im selben Bereich wie vor Beginn Ihres Codes wiederhergestellt, wobei der Autofilter jedoch auf Datenänderungen aktualisiert wird.
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