Desculpe, representante insuficiente para comentar. (Admins, sinta-se livre para cortar isso em um comentário acima.) User "danicotra" resposta começando com "Eu uso um VBA / Macro com base no evento Worksheet_Change também, mas minha abordagem ..." com
'primeiro remover filtro
'em seguida, aplique-o novamente
é a solução correta ao usar o Excel 2007+. No entanto, .AutoFilter.ApplyFilter é inválido no XL03 e anterior, então mostro o caminho abaixo.
Eu imploro que verdadeiros especialistas e gurus leiam o código, porque estou bastante confiante de que ele é o material mais vendido. Talvez o inexplicável número negativo conte com essa resposta pode ser revertido quando as pessoas verem o que é bom feito abaixo.
danicotra usou um exemplo simplificado. Na verdade, você pode fazer isso de maneira mais geral. Suponha que com o ActiveSheet para o seguinte (ou algum outro objeto de pasta):
-
Salve o intervalo do autofiltro. Tem colunas .AutoFilter.Filters.Count e (.AutoFilter.Range.Count / .AutoFilter.Filters.Count) linhas, salvas em rngAutofilter
-
Colete em uma matriz myAutofilters de cada uma das 4 propriedades de cada um dos itens do autofilter .AutoFilter.Filters.Count, tomando cuidado para evitar "Erros definidos pelo aplicativo" quando .On ou .Operator for falso. (myAutofilters seria reDim'd para o número de linhas e colunas no passo 1)
-
Desative o filtro, mas preserve os menus suspensos com .ShowAllData
-
Para cada item de filtro que foi .Em acordo com sua matriz salva, redefina 3 das 4 propriedades de cada um dos itens do filtro automático .AutoFilter.Filters.Count. Novamente, tome cuidado para evitar "Erros definidos pelo aplicativo" quando .O operador é falso, portanto, para cada item "i",
Campo rngAutofilter.AutoFilter: = i, Criteria1: = myAutofilters (i, 2)
ou
rngAutofilter.AutoFilter Field: = i, Criteria1: = myAutofilters (i, 2), Operador: = myAutofilters (i, 3), Criteria2: = myAutofilters (i, 4)
Agora, o filtro automático será reinstituído, na mesma faixa em que estava antes de seu código ser iniciado, mas com o filtro automático atualizado para alterações nos dados.
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