Lo siento, no hay suficientes representantes para comentar. (Administradores, siéntanse libres de cortar esto en un comentario arriba.) La respuesta del usuario “danicotra” que comienza con “Yo también uso un VBA/Macro basado en el evento Worksheet_Change, pero mi enfoque…” con
‘ primero quitar el filtro
’ luego aplicarlo de nuevo
es la solución correcta cuando se usa Excel 2007+. Sin embargo .AutoFilter.ApplyFilter no es válido en XL03 y anteriores por lo que muestro la forma de abajo.
Ruego que los verdaderos expertos y gurús lean el código porque estoy bastante seguro de que es material de primera. Tal vez la inexplicable cuenta de downvote en esta respuesta pueda revertirse cuando la gente vea el buen material que se hace abajo.
danicotra utilizó un ejemplo simplificado. En realidad, usted puede hacer esto de manera más general. Supongamos Con ActiveSheet para lo siguiente (o algún otro objeto de hoja):
Guarda el rango del autofiltro. Tiene columnas de .Autofiltro.Cuenta, y filas de (.Autofiltro.Cuenta/.Autofiltro.Cuenta), guardadas en rngAutofiltro
Recoge en un array myAutofilters cada una de las 4 propiedades de cada uno de los autofiltros .AutoFilter.Filters.Count, teniendo cuidado de que no se produzcan “errores definidos por la aplicación” cuando .On u .Operator sean falsos. (myAutofilters se reDim’d al número de filas y columnas del paso 1)
Desactive el filtro pero conserve los desplegables con .ShowAllData
Para cada elemento del filtro que estaba .On según su matriz guardada, restablezca 3 de las 4 propiedades de cada uno de los elementos del autofiltro .AutoFilters.Count. De nuevo, tenga cuidado de evitar “errores definidos por la aplicación” cuando .Operator es falso, así que para cada elemento “i”,
rngAutofilter.AutoFilter Field:=i, Criteria1:=myAutofilters(i,2)
o
rngAutofilter. AutoFilter Field:=i, Criteria1:=myAutofilters(i,2), Operator:=myAutofilters(i,3), Criteria2:=myAutofilters(i,4)
Ahora el autofiltro se restablecerá, sobre el mismo rango que había antes de que su código comenzara, pero con el autofiltro actualizado para los cambios en los datos.
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