🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

VBA AutoFilter en Excel — filtrar filas en código (y por qué oculto no es eliminado)

|

VBA AutoFilter en Excel — filtrar filas en código (y por qué oculto no es eliminado)

TL;DRAutoFilter oculta las filas que no cumplen tus criterios — no las elimina. Esas filas ocultas siguen en el rango, siguen contando en SUM y se siguen copiando con un simple .Copy. Para leer, copiar o eliminar solo lo que está visible, debes pasar por .SpecialCells(xlCellTypeVisible). Y ojo con la trampa del interruptor: llamar a .AutoFilter sin argumentos activa o desactiva el filtrado, así que una macro que «pone un filtro» puede apagar el filtro cuando se ejecuta por segunda vez. Limpia el estado primero con .AutoFilterMode = False.

' Filtra una tabla a Region = "West", luego actua solo sobre las filas VISIBLES.
Dim ws As Worksheet: Set ws = ThisWorkbook.Worksheets("Sales")
ws.AutoFilterMode = False                      ' limpia primero cualquier filtro sobrante

With ws.Range("A1").CurrentRegion              ' la tabla entera, incluida la cabecera
    .AutoFilter Field:=2, Criteria1:="West"    ' Field empieza en 1 DENTRO del rango
    ' solo las filas de datos visibles (salta la cabecera con Offset(1)):
    .Offset(1).SpecialCells(xlCellTypeVisible).EntireRow.Copy _
        Destination:=Worksheets("West").Range("A1")
End With
ws.AutoFilterMode = False                       ' quita el filtro al terminar

AutoFilter es la forma más rápida de reducir una tabla a las filas que te importan, y es el motor que hay detrás de la eliminación masiva más veloz de Excel VBA. Pero engaña a la gente porque parece que ha quitado filas cuando lo único que hizo fue ocultarlas. Casi todos los errores de AutoFilter son una versión de ese único malentendido, así que ahí es donde empieza esta guía.

Lo que aprenderás

  • El modelo mental — AutoFilter es una vista, no un borrado; las filas ocultas siguen ahí
  • Por qué SUM y .Copy siguen incluyendo las filas filtradas, y cómo lo arregla SpecialCells(xlCellTypeVisible)
  • Fijar criterios — valores sueltos, operadores de comparación, dos condiciones y «en una lista»
  • La trampa del interruptor — por qué una llamada .AutoFilter sin argumentos apaga el filtrado
  • El patrón profesional de filtrar y luego eliminar para quitar miles de filas rápido
  • AutoFilter frente a la función FILTER frente a Filtro avanzado — a cuál recurrir

El modelo mental: un filtro es una vista, no un borrado

Cuando aplicas un filtro, Excel hace exactamente una cosa: fija la propiedad hidden en cada fila que no coincide. Los datos no se mueven. No se quita nada. Estás mirando el mismo rango a través de una plantilla que impide ver algunas filas.

Esa es toda la idea, y tiene una consecuencia que a la gente le sorprende la primera vez: todo lo que opera sobre el rango sigue viendo las filas ocultas. =SUM(B2:B1000) suma los números filtrados. Range("B2:B1000").Copy los copia todos, ocultos o no. Un bucle For Each cell visita cada uno. El filtro cambió lo que ves; no cambió lo que el rango contiene.

Así que el modelo mental es una pregunta que te haces antes de cada operación sobre una tabla filtrada: ¿quiero todas las filas, o solo las visibles? Si la respuesta es «solo las visibles», no puedes usar el rango directamente — tienes que pedirle a Excel el subconjunto visible de forma explícita. Ese es el único hábito que hace fiable a AutoFilter.

La regla más importante: alcanza las filas visibles a través de SpecialCells

Para tocar solo las filas que el filtro dejó a la vista, conviertes el rango en sus celdas visibles:

Dim visible As Range
On Error Resume Next     ' xlCellTypeVisible lanza 1004 si no hay nada visible
Set visible = ws.Range("A1").CurrentRegion.Offset(1) _
                  .SpecialCells(xlCellTypeVisible)
On Error GoTo 0

If Not visible Is Nothing Then
    ' visible es un rango de VARIAS AREAS - las filas filtradas no son contiguas
    MsgBox "Visible rows: " & visible.Rows.Count
End If

Dos cosas que interiorizar aquí. Primero, SpecialCells(xlCellTypeVisible) devuelve un rango de varias áreas — porque las filas visibles están dispersas con ocultas entre medias. Recórrelo con For Each area In visible.Areas cuando necesites procesar bloques, o usa operaciones .EntireRow que gestionan las áreas por ti. Segundo, lanza el error 1004 cuando no hay nada visible (un filtro que coincidió con cero filas), así que protégelo con On Error. Sáltate SpecialCells y opera sobre el rango en bruto, y estarás trabajando en silencio también sobre las filas ocultas — el error de AutoFilter más común que existe.

Fijar criterios: valores, operadores y listas

AutoFilter toma un Field (empieza en 1 dentro del rango filtrado, no la letra de columna de la hoja) y uno o dos criterios:

With ws.Range("A1").CurrentRegion
    ' valor exacto
    .AutoFilter Field:=2, Criteria1:="West"

    ' comparacion - fijate en que el operador va dentro de la cadena
    .AutoFilter Field:=3, Criteria1:=">1000"

    ' dos condiciones en un campo (entre 100 y 500)
    .AutoFilter Field:=3, Criteria1:=">=100", Operator:=xlAnd, Criteria2:="<=500"

    ' "en una lista" - un array mas xlFilterValues
    .AutoFilter Field:=2, Criteria1:=Array("West", "East"), Operator:=xlFilterValues
End With

La trampa que pilla a todo el mundo una vez: Field cuenta desde el borde izquierdo del rango sobre el que llamaste a .AutoFilter, no desde la columna A de la hoja. Si tu tabla empieza en la columna C, Field:=1 es la columna C. Equivoca ese desfase y filtrarás la columna equivocada sin ningún error.

La trampa del interruptor: un AutoFilter a secas apaga el filtrado

.AutoFilter llamado sin argumentos es un interruptor — enciende las flechas del filtro si están apagadas, y las apaga si están encendidas. Eso lo hace peligroso dentro de una macro que podría ejecutarse más de una vez:

ws.Range("A1").CurrentRegion.AutoFilter    ' ejecutalo una vez: flechas ON. ejecutalo otra vez: flechas OFF.

El mismo carácter de estado muerde de una forma más sutil: un filtro que quedó de una ejecución anterior — o de un usuario filtrando a mano — cambia en silencio lo que significa «visible» la próxima vez que tu código lee el rango. No te fíes del estado de filtro heredado. Empieza limpiándolo, y límpialo de nuevo cuando termines:

ws.AutoFilterMode = False   ' quita cualquier filtro existente - borron y cuenta nueva
' ... aplica tu filtro, haz tu trabajo ...
ws.AutoFilterMode = False   ' deja la hoja como la encontraste

Comprobar If ws.AutoFilterMode Then te dice si hay un filtro activo ahora mismo. Hacer que tu macro sea independiente del estado — limpiar, filtrar, trabajar, limpiar — es lo que frena la clase de error de «funcionó una vez, se rompió la segunda».

El patrón que vale la pena memorizar: filtra, luego elimina las filas visibles

Por esto AutoFilter se gana su sitio en el código serio. Para eliminar miles de filas que cumplen una condición, filtrar y eliminar las celdas visibles es drásticamente más rápido que recorrer un bucle — Excel se encarga de la coincidencia, y un solo .Delete las quita todas:

With ws.Range("A1").CurrentRegion
    .AutoFilter Field:=5, Criteria1:="Cancelled"
    ' elimina las filas de datos visibles - Offset(1) salta la cabecera, o borras tus titulos
    On Error Resume Next
    .Offset(1).SpecialCells(xlCellTypeVisible).EntireRow.Delete
    On Error GoTo 0
End With
ws.AutoFilterMode = False

El .Offset(1) es el truco: sin él, la fila de cabecera también está visible y se elimina junto con los datos. Este enfoque de filtrar y luego eliminar se combina de forma natural con las técnicas de eliminación de VBA eliminar filas — y es el enfoque al que recurro antes que a un bucle hacia atrás siempre que el número de coincidencias es grande.

AutoFilter frente a la función FILTER frente a Filtro avanzado

Tres herramientas comparten la palabra «filtro» y resuelven problemas distintos:

  • AutoFilter oculta las filas que no coinciden en su sitio. Úsalo cuando quieras ver, copiar o eliminar un subconjunto de una tabla existente. Es una vista sobre el original.
  • La función de hoja FILTER() derrama un array nuevo de filas coincidentes en otro sitio, vivo y recalculándose. Úsala cuando quieras una lista guiada por fórmulas que se actualiza sola — sin necesidad de macro.
  • Filtro avanzado (Range.AdvancedFilter) puede copiar las coincidencias a otra ubicación o extraer valores únicos con un rango de criterios. Úsalo para extracciones complejas de varias condiciones.

El juicio: para «reduce esta tabla para que pueda actuar sobre las coincidencias», AutoFilter es lo correcto. Si te descubres queriendo una lista de coincidencias viva y autoactualizable en otro lugar, deja de escribir una macro — ese es el trabajo de la función FILTER(), no de AutoFilter.

Cómo ayuda ExcelMaster

Las trampas de AutoFilter son todas silenciosas: sumar un rango filtrado e incluir las filas ocultas, copiar y llevarte todo, eliminar sin SpecialCells y golpear las celdas equivocadas, el desfase de Field, el interruptor que apaga tu filtro en la segunda ejecución. Ninguna lanza un error — simplemente actúan sobre filas que creías desaparecidas.

ExcelMaster te deja decir lo que quieres que muestre la tabla. Describe «conserva solo las filas de la región West por encima de 1000» o «elimina cada pedido Cancelled», y limpia primero el estado de filtro obsoleto, acierta con el índice Field, pasa por SpecialCells(xlCellTypeVisible) para cualquier cosa que toque solo las filas visibles, y hace una copia de seguridad de la hoja antes de eliminar. Te quedas con el libro y con el código; te ahorras la parte en la que una fila oculta se cuela en tu total.

Preguntas frecuentes

¿VBA AutoFilter elimina las filas que filtra?

No. AutoFilter solo oculta las filas que no coinciden — permanecen en el rango, siguen contando en SUM, se siguen copiando con .Copy y los bucles las siguen visitando. Para trabajar solo sobre las filas visibles debes pasar por .SpecialCells(xlCellTypeVisible). Para eliminar filas de verdad, filtra y luego elimina las celdas visibles.

¿Por qué SUM sigue incluyendo mis filas filtradas en VBA?

Porque filtrar oculta las filas, no las quita, y SUM suma los valores ocultos. Usa SUBTOTAL(109, range) en lugar de SUM para totalizar solo las filas visibles, o en VBA suma .SpecialCells(xlCellTypeVisible). Esta es la señal más clara de que un filtro es una vista, no un borrado.

¿Cómo filtro por dos condiciones en VBA AutoFilter?

Pasa Criteria1, un Operator y Criteria2. Para un intervalo usa xlAnd (Criteria1:=">=100", Operator:=xlAnd, Criteria2:="<=500"); para uno u otro usa xlOr. Para «valor en una lista» pasa un array a Criteria1 con Operator:=xlFilterValues.

¿Por qué mi AutoFilter se apaga cuando la macro se ejecuta otra vez?

Porque llamar a .AutoFilter sin argumentos es un interruptor — enciende el filtrado si está apagado y lo apaga si está encendido. Ejecútalo dos veces y el filtro desaparece. Haz la macro independiente del estado: llama a ws.AutoFilterMode = False para limpiar primero, y luego aplica tu filtro con argumentos explícitos.

¿Cuál es la forma más rápida de eliminar filas por condición en VBA?

Aplica AutoFilter para que coincidan las filas que quieres fuera, y luego elimina las celdas visibles en una sola llamada: .Offset(1).SpecialCells(xlCellTypeVisible).EntireRow.Delete (el Offset(1) salta la cabecera). Excel se encarga de la coincidencia y una sola eliminación las quita todas, lo que es mucho más rápido que recorrer fila por fila.

Probado en

Probado en: Excel 365 (Windows 11), VBA 7.1 — última verificación el 08/08/2026.

Guías relacionadas: VBA Find · VBA Sort · VBA eliminar filas · VBA última fila · VBA Range