TL;DR —
AutoFilteroculta las filas que no cumplen tus criterios — no las elimina. Esas filas ocultas siguen en el rango, siguen contando enSUMy 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.AutoFiltersin 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é
SUMy.Copysiguen incluyendo las filas filtradas, y cómo lo arreglaSpecialCells(xlCellTypeVisible) - Fijar criterios — valores sueltos, operadores de comparación, dos condiciones y «en una lista»
- La trampa del interruptor — por qué una llamada
.AutoFiltersin 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 tú 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
