TL;DR —
Range.AdvancedFilteres el único filtro que te entrega datos, no una vista. En una sola llamada puede copiar una lista única o un conjunto de filas que cumplen un criterio a otra ubicación, sin un bucle y sin eliminar nada. Dos ideas lo desbloquean. Primero,Actionelige entrexlFilterInPlace(oculta filas, como AutoFilter) yxlFilterCopy(copia los resultados a unCopyToRange— el modo potente). Segundo, su «cláusula WHERE» no es código — es un rango de criterios, un pequeño bloque de celdas cuya cabecera debe coincidir exactamente con la cabecera de origen. AñadeUnique:=Truey obtienes una lista distinta en una línea, con el original intacto.
' Extrae una lista distinta de valores de Region de la columna B a la columna E. No destructivo.
Dim ws As Worksheet: Set ws = ThisWorkbook.Worksheets("Sales")
ws.Range("B1:B1000").AdvancedFilter _
Action:=xlFilterCopy, _
CopyToRange:=ws.Range("E1"), _ ' E1 debe tener la MISMA cabecera que B1
Unique:=True ' uno de cada valor, la fuente sin cambios
AdvancedFilter es la herramienta a la que la gente recurre la última y a la que debería recurrir la
primera. Cuando necesitas un resultado como datos — una lista distinta, una exportación de las
filas que cumplen una condición, una copia sin duplicados que deja el original intacto — el instinto
es escribir un bucle For Each con un If y un Dictionary. Excel ya tiene un motor de consultas
justo para esto. Esta guía se construye alrededor de sus dos ideas definitorias: puede copiar en
lugar de ocultar, y sus criterios viven en celdas.
Lo que aprenderás
- El modelo mental — SQL-lite para un rango: extraer, no solo ver
- En su sitio frente a copiar —
xlFilterInPlacefrente axlFilterCopy - El rango de criterios — tu cláusula WHERE vive en celdas, no en código
Unique:=True— una lista distinta sin eliminar nada- La trampa de la coincidencia de cabeceras que devuelve una salida vacía
AdvancedFilterfrente aAutoFilterfrente aRemoveDuplicates
El modelo mental: SQL-lite para un rango
Piensa en AdvancedFilter como un pequeño motor de consultas atornillado a un rango. AutoFilter
responde «¿qué filas quiero ver?» y oculta el resto en su sitio. AdvancedFilter responde una
pregunta más grande: «dame las filas que coinciden — como un conjunto nuevo de datos que puedo
poner en algún sitio y usar». También puede filtrar en su sitio, pero su razón de existir es el modo
copia: toma un rango de origen, un conjunto opcional de condiciones, y escribe las filas coincidentes
(o únicas) en un destino que tú eliges.
Ese replanteamiento importa porque reemplaza toda una categoría de bucles. «Consigue los clientes únicos», «lleva cada pedido por encima de 1000 a una hoja de informe», «lista los códigos de producto distintos» — son extracciones de una sola llamada, no iteración. Quédate con la imagen — AdvancedFilter produce datos, AutoFilter produce una vista — y sabrás cuál necesita una tarea.
En su sitio frente a copiar: xlFilterInPlace frente a xlFilterCopy
El argumento Action es la bifurcación del camino:
xlFilterInPlaceoculta las filas que no coinciden justo en el rango de origen, exactamente comoAutoFilter. Los datos no se mueven; obtienes una vista filtrada. Para limpiarla después llamas aws.ShowAllData.xlFilterCopydeja en paz la fuente y copia las filas coincidentes enCopyToRange. Este es el modo que hace especial aAdvancedFilter— es no destructivo y produce un bloque de datos separado y utilizable.
' Modo copia - el que normalmente querras.
ws.Range("A1").CurrentRegion.AdvancedFilter _
Action:=xlFilterCopy, _
CriteriaRange:=ws.Range("H1:H2"), _ ' la clausula WHERE (ver mas abajo)
CopyToRange:=ws.Range("K1"), _ ' donde aterrizan los resultados
Unique:=False
Si pasas xlFilterCopy debes proporcionar CopyToRange; si pasas xlFilterInPlace no debes
(Excel da error en ambos sentidos si los mezclas). Ante la duda, copia — nunca toca tu original.
El rango de criterios: tu cláusula WHERE vive en celdas
Esta es la parte que resulta extraña si vienes de otros lenguajes: AdvancedFilter no toma una
condición como una cadena ni como una expresión. Sus condiciones viven en un rango de criterios —
un pequeño bloque de celdas de la hoja. La fila superior contiene cabeceras de columna que coinciden
con el origen, y las filas de debajo contienen las condiciones.
H I
1 Region Amount
2 West >1000
Ese rango de criterios dice «Region es West Y Amount > 1000». Las condiciones en la misma fila son
AND; las condiciones apiladas en filas separadas son OR. Así que dos filas —
H
1 Region
2 West
3 East
— significa «Region es West O East». Puedes construir este bloque en celdas que tu macro controla (un
área de borrador, o una hoja oculta) y apuntar CriteriaRange a él:
ws.Range("A1").CurrentRegion.AdvancedFilter _
Action:=xlFilterCopy, _
CriteriaRange:=ws.Range("H1:I2"), _
CopyToRange:=ws.Range("K1")
Omite CriteriaRange por completo y no se aplica ninguna condición — lo cual, combinado con
Unique:=True, es exactamente cómo obtienes una lista distinta sin más.
Unique:=True — una lista distinta sin eliminar nada
Fija Unique:=True y AdvancedFilter devuelve uno de cada fila distinta (o valor, para una sola
columna) — el mismo resultado que Quitar duplicados, salvo que copia los únicos hacia fuera y
deja la fuente intacta. Esa única propiedad es la razón por la que AdvancedFilter es la forma
segura de desduplicar:
' Nombres de cliente distintos a la columna K, lista original intacta.
ws.Range("C1:C5000").AdvancedFilter _
Action:=xlFilterCopy, _
CopyToRange:=ws.Range("K1"), _
Unique:=True
Donde RemoveDuplicates elimina en su sitio sin deshacer, esto te entrega una lista fresca y sin
duplicados y nunca pone en riesgo el original. Cuando alguien pregunta «¿cómo obtengo valores únicos
en VBA sin destrozar los datos?», esta es la respuesta.
La trampa de la coincidencia de cabeceras que devuelve una salida vacía
La razón número uno por la que AdvancedFilter «no devuelve nada» es una discrepancia de cabeceras.
Tanto la cabecera de CriteriaRange como la de CopyToRange deben coincidir con las
cabeceras de origen exactamente — la misma grafía, el mismo espaciado, el mismo texto sin
distinción de mayúsculas. Una cabecera de criterios «Reigon» (errata), o un CopyToRange cuya celda
superior está en blanco o mal etiquetada, produce una salida vacía o incorrecta sin lanzar ningún
error.
Dos hábitos lo evitan:
- Construye las cabeceras de criterios y de destino copiando las celdas de cabecera reales, nunca reescribiéndolas a mano.
- Si filtras a otra hoja, recuerda una vieja regla: el
AdvancedFilterclásico quiere elCopyToRangeen la hoja activa. El patrón robusto es ejecutar el filtro desde la hoja en la que aterrizan los resultados, o filtrar hacia un rango de borrador en la hoja de origen y mover el resultado después.
Cuando la salida vuelve vacía, comprueba las cabeceras antes que ninguna otra cosa.
AdvancedFilter frente a AutoFilter frente a RemoveDuplicates
Se solapan lo bastante para confundir y difieren lo bastante para importar:
AutoFilter— una vista. Oculta filas en su sitio para que el usuario vea un subconjunto; no se copia ni se elimina nada. Échale mano para mostrar un rango filtrado.AdvancedFilter(modo copia) — una consulta. Extrae filas coincidentes o únicas a una nueva ubicación, de forma no destructiva. Échale mano cuando necesitas el resultado como datos.RemoveDuplicates— un borrado. Encoge los datos en su sitio, conserva la primera de cada, sin deshacer. Échale mano solo cuando de verdad quieres la fuente en sí más pequeña y tienes una copia de seguridad.
La frase que vale la pena recordar: AutoFilter muestra, RemoveDuplicates destruye, y
AdvancedFilter es el que extrae — una lista distinta o una copia que cumple un criterio — sin
tocar el original. Cuando te descubras escribiendo un bucle para construir una lista filtrada o única,
eso es AdvancedFilter.
Cómo ayuda ExcelMaster
AdvancedFilter es potente precisamente porque es quisquilloso: la bifurcación entre en-su-sitio y
copiar, el rango de criterios que tiene que vivir en celdas con cabeceras que coinciden al pie de la
letra, el destino de copia y su regla de hoja activa, el indicador Unique. Equivoca cualquier
cabecera y no devuelve nada, en silencio.
ExcelMaster te deja
describir la consulta en su lugar. Di «lleva cada pedido por encima de 1000 de la región West a una
hoja nueva» o «dame la lista distinta de códigos de producto», y dispone el rango de criterios con las
cabeceras copiadas del origen, elige el modo copia con un CopyToRange válido, fija Unique cuando
quieres valores distintos, y deja los datos originales intactos. Te quedas con el libro y con el
código; te ahorras la media hora de preguntarte por qué una cabecera de criterios mal escrita devolvió
un resultado vacío.
Preguntas frecuentes
¿Cómo uso Filtro avanzado en VBA?
Llama a AdvancedFilter sobre el rango de origen: elige Action:=xlFilterCopy para copiar los
resultados a otro sitio (con un CopyToRange) o xlFilterInPlace para ocultar las filas que no
coinciden. Proporciona un CriteriaRange para las condiciones, o fija Unique:=True sin criterios
para extraer una lista distinta. En modo copia, los datos de origen quedan sin cambios.
¿Cómo extraigo valores únicos con Filtro avanzado de VBA?
Usa el modo copia con Unique:=True y sin criterios: rng.AdvancedFilter Action:=xlFilterCopy, CopyToRange:=ws.Range("E1"), Unique:=True. Escribe uno de cada valor distinto en el destino y deja la
fuente intacta — a diferencia de RemoveDuplicates, que elimina en su sitio. La cabecera de
CopyToRange debe coincidir con la cabecera de origen.
¿Por qué Filtro avanzado de VBA no devuelve nada?
Casi siempre una discrepancia de cabeceras. Las cabeceras de la fila superior de CriteriaRange y
CopyToRange deben coincidir con las cabeceras de origen exactamente (una errata o una cabecera en
blanco devuelve una salida vacía sin error). Copia las celdas de cabecera reales en lugar de
reescribirlas a mano, y asegúrate de que un filtro en modo copia tenga un CopyToRange válido.
¿Cuál es la diferencia entre AutoFilter y Filtro avanzado en VBA?
AutoFilter produce una vista — oculta en su sitio las filas que no coinciden y no copia nada.
AdvancedFilter produce datos — en modo copia extrae filas coincidentes o únicas a una nueva
ubicación sin alterar el origen, y admite criterios AND/OR complejos y una extracción de únicos que
AutoFilter no puede.
¿Cómo funcionan los criterios en Filtro avanzado de VBA?
Los criterios viven en un rango de celdas, no en código. La fila superior contiene cabeceras que
coinciden con el origen; las condiciones en la misma fila se combinan con AND, y las condiciones en
filas separadas se combinan con OR. Apunta CriteriaRange a ese bloque. Omítelo para no aplicar
ninguna condición (útil con Unique:=True).
Probado en
Probado en: Excel 365 (Windows 11), VBA 7.1 — última verificación el 10/08/2026.
Guías relacionadas: VBA AutoFilter · VBA eliminar duplicados · VBA Sort · VBA Find · VBA Range
