¿Cómo actualizar automáticamente un filtro automático de Excel cuando se cambian los datos?

15

¿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.

Sorin
fuente
3
Pude hacerlo funcionar cuando puse ese código en el evento Worksheet_Change () en lugar del evento Worksheet_Calculate ().
F106dart
1
ponga esto como respuesta y acéptelo, para que otros sepan lo que hizo y que la pregunta se haya resuelto.
jzd
Tuve que hacer otra modificación porque Calculate esperaba un parámetro. ¡Ahora funciona!.
sorin

Respuestas:

7

El intercambio del código con esto también parece ser el truco (al menos en Excel 2010):

Private Sub Worksheet_Change(ByVal Target As Range)

    ActiveSheet.AutoFilter.ApplyFilter

End Sub
Chris
fuente
4

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

No más hacks
fuente
1

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
Sorin
fuente
1

También uso un VBA / Macro basado en un Worksheet_Changeevento, 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

danicotra
fuente
0

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. ;)

Chico al azar
fuente
-1

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):

  1. Guarde el rango del autofiltro. Tiene columnas .AutoFilter.Filters.Count y (.AutoFilter.Range.Count / .AutoFilter.Filters.Count) filas, guardadas en rngAutofilter

  2. 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)

  3. Apague el filtro pero conserve los menús desplegables con .ShowAllData

  4. 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
MicrosoftShouldBeKickedInNuts
fuente
¿Por qué en el MUNDO alguien rechazaría esta útil respuesta, que incluso incluye un código completo e independiente (y muy probado), e incluso da una explicación detallada del código? Estoy preguntando, en serio. ¿La gente quiere una buena ayuda profesional en superusuario o no debería molestarme? ¿Hay trolls que simplemente van a votar hacia abajo, para apoyarse relativamente?
MicrosoftShouldBeKickedInNuts
1
Al menos tenga los b___s para comentar si vota negativamente, para que pueda usar los comentarios para servir mejor a la comunidad. Administradores, esa es una propuesta que me gustaría hacer. Tener todos los votos negativos requieren un comentario explicativo. He visto muchas publicaciones claramente geniales inexplicablemente rechazadas, lo que realmente parece ser una epidemia en superusuario, y en ningún otro lugar.
MicrosoftShouldBeKickedInNuts
-1
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; "")

Bojan Djuric
fuente