¿Cómo actualizo automáticamente un filtro automático de Excel cuando se modifican los datos?
Caso de uso: cambio el valor de una celda a un valor que se filtró. Quiero ver desaparecer la fila actual sin tener que hacer nada más.
¿Cómo actualizo automáticamente un filtro automático de Excel cuando se modifican los datos?
Caso de uso: cambio el valor de una celda a un valor que se filtró. Quiero ver desaparecer la fila actual sin tener que hacer nada más.
Respuestas:
Descubrí que cuando trabajaba con tablas, esto no funcionaba. El filtro no estaba en la hoja sino en la mesa. este código hizo el truco
Private Sub Worksheet_Change(ByVal Target As Range)
With ActiveWorkbook.Worksheets("Sheet1").ListObjects("Table1")
.AutoFilter.ApplyFilter
End With
End Sub
Encontré la información aquí: http://www.jkp-ads.com/articles/Excel2007TablesVBA.asp
Haga clic derecho en el nombre de su hoja, elija "Ver código" y pegue el código a continuación. Después de pegar, haga clic en el icono de Excel debajo de "Archivo" en la esquina superior izquierda, o escriba Alt-F11, para volver a la vista de hoja de cálculo.
Esto habilitará la actualización automática. No olvide guardar el archivo en un formato con soporte de macro mentira .xlsm
.
Private Sub Worksheet_Change(ByVal Target As Range)
If Me.FilterMode = True Then
With Application
.EnableEvents = False
.ScreenUpdating = False
End With
With ActiveWorkbook
.CustomViews.Add ViewName:="Mine", RowColSettings:=True
Me.AutoFilterMode = False
.CustomViews("Mine").Show
.CustomViews("Mine").Delete
End With
With Application
.EnableEvents = True
.ScreenUpdating = True
End With
End If
End Sub
También uso un VBA / Macro basado en un Worksheet_Change
evento, pero mi enfoque es ligeramente diferente ... Ok, primero el código y luego las explicaciones:
Private Sub Worksheet_Change(ByVal Target As Range)
' first remove filter
ActiveSheet.Range("$L$1:$L$126").AutoFilter Field:=1
' then apply it again
ActiveSheet.Range("$L$1:$L$126").AutoFilter Field:=1, Criteria1:="<>0"
End Sub
(Use la combinación de teclas Alt+ F11para que aparezca el panel de desarrollo y pegue el código en la hoja de trabajo que contiene el filtro que desea actualizar automáticamente).
En mi ejemplo, supongo que tengo un filtro simple en una sola columna (L en mi caso) y que mi rango de datos está en filas de 1 (incluso si puede contener encabezado) a 126 (elija un número lo suficientemente grande como para ser seguro). La operación es simple: a medida que algo cambia en mi hoja, el filtro en el rango especificado se elimina / vuelve a aplicar para que se actualice. Lo que necesita un poco de explicación aquí son Field and Criteria .
El campo es un desplazamiento de rango entero. En mi caso, solo tengo un filtro de una sola columna y el rango está formado por una sola columna (L), que es la primera en el rango (por lo tanto, uso 1 como valor).
El criterio es una cadena que describe el filtro que se aplicará al rango de datos. En mi ejemplo, quiero mostrar solo las filas donde la columna L difiere de 0 (por lo tanto, usé "<> 0").
Eso es todo. Para obtener más referencias sobre el método Range.AutoFilter, consulte: https://msdn.microsoft.com/en-us/library/office/ff193884.aspx
Solo para consolidar la (s) respuesta (s):
Sorin dice:
Haga clic derecho en el nombre de su hoja, elija "Ver código" y pegue el código a continuación. Después de pegar, haga clic en el icono de Excel debajo de "Archivo" en la esquina superior izquierda, o escriba Alt-F11, para volver a la vista de hoja de cálculo.
Esto habilitará la actualización automática. No olvide guardar el archivo en un formato compatible con macros .xlsm.
Y Chris usó este código (que acabo de hacer en 2010):
Private Sub Worksheet_Change(ByVal Target As Range)
ActiveSheet.AutoFilter.ApplyFilter
End Sub
Si no expande la publicación, solo verá la respuesta larga. ;)
Lo sentimos, representante insuficiente para comentar. (Administradores, siéntanse libres de cortar esto en un comentario anterior). 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 eliminar filtro
" y 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, así que muestro el camino a continuación.
Ruego a los verdaderos expertos y gurús que lean el código porque estoy bastante seguro de que es un material de primera calidad. Quizás el inexplicable recuento de votos negativos en esta respuesta se puede revertir cuando la gente ve lo que se hace a continuación.
danicotra usó un ejemplo simplificado. En realidad, puedes hacer esto de manera más general. Asumir con ActiveSheet para lo siguiente (o algún otro objeto de hoja):
Guarde el rango del autofiltro. Tiene columnas .AutoFilter.Filters.Count y (.AutoFilter.Range.Count / .AutoFilter.Filters.Count) filas, guardadas en rngAutofilter
Recopile en una matriz myAutofilters cada una de las 4 propiedades de cada uno de los elementos de Autofiltro .AutoFilter.Filters.Count, teniendo cuidado de evitar "errores definidos por la aplicación" cuando .On o .Operator son falsos. (myAutofilters se redirigiría al número de filas y columnas en el paso 1)
Apague el filtro pero conserve los menús desplegables con .ShowAllData
Para cada elemento de filtro que estaba .De acuerdo con su matriz guardada, restablezca 3 de las 4 propiedades de cada uno de los elementos de autofiltro .AutoFilter.Filters.Count. De nuevo, tenga cuidado de evitar los "errores definidos por la aplicación" cuando .Operator es falso, por lo que para cada elemento "i",
rngAutofilter.AutoFilter Field: = i, Criteria1: = myAutofilters (i, 2)
o
rngAutofilter.AutoFilter Field: = i, Criterio1: = myAutofilters (i, 2), Operador: = myAutofilters (i, 3), Criterio2: = myAutofilters (i, 4)
Ahora se restablecerá el autofiltro, en el mismo rango que antes de que comenzara su código, pero con el autofiltro actualizado para 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
usando "data, from table" / power query en excel, que nos da la opción de actualizar los datos al abrir el archivo. (también ordenación automática y columna de índice (número de filas filtradas automáticamente)) Esto creará el resultado en otra hoja. -seleccionar los datos requeridos con el mouse (filas y columnas) -Haga clic en la pestaña de datos, de la tabla -en la última columna, excluya espacios en blanco (opcional, si desea mostrar solo celdas rellenas) -añadir columna, columna de índice (opcional, si desea agregar un número de fila a los resultados filtrados) -cerrar y cargar a para editar nuevamente, haga clic en la pestaña de consulta y luego en editar haga clic en la pestaña de diseño en Excel, en la flecha debajo de actualizar, propiedades de conexión, Actualizar datos al abrir el archivo. adaptado de: https://www.excelcampus.com/tips/sort-drop-down-lists-automatically/ parte: 3. Ordenar listas desplegables usando Power Query También puede copiar datos de la hoja1 si no está vacío, por ejemplo, el campo a1. copie esto en el campo a1 en la hoja2: = SI (Hoja1! A1 ""; Hoja1! A1; "")