EXTRAER REGISTROS ÚNICOS CON FILTRO AVANZADO EN VBA

Una de las situaciones más habituales en Excel es encontrarnos en nuestras bases de datos con registros duplicados. Esto se puede deber a muchos motivos, algunos necesarios y otros fruto de errores en la programación o sencillamente porque no queda otro remedio.

De la misma forma existen multitud de alternativas para extraer los registros únicos. Una forma muy sencilla es realizar esta tarea con el filtro avanzado, que encontraremos en la cinta de opciones en la pestaña de “Datos” en “Avanzadas” justo al lado de Filtro:

EXTRAER REGISTROS ÚNICOS CON FILTRO AVANZADO EN VBA

Simplemente lo que hace la herramienta es filtrar un rango de datos y extraer el resultado en base a un criterio o también si queremos que extraiga los registros únicos. Pero el filtro avanzado suele ser un poco “engorroso”, sobre todo cuando tenemos que mover los datos a otra hoja de nuestro archivo.

La solución es automatizar los procesos y para ello es necesario utilizar VBA. Para poder realizar el ejemplo utilizaré una pequeña base de datos con registros duplicados que se compone de marcas de vehículos y tipos de combustible que usan, nuestra hoja se llama “DATOS”:

EXTRAER REGISTROS ÚNICOS CON FILTRO AVANZADO EN VBA1

Imaginemos que nos piden extraer las marcas pero sin duplicados, es decir la columna A. Para ello vamos a utilizar esta sencilla macro:

Sub UNICOS_UNA_COLUMNA()
'definimos las variables que vamos a utilizar como rango
Dim Lista, Unicos As Range
fin = Application.CountA(Sheets("DATOS").Range("A:A"))
'Lista hace referencia al rango de datos que queremos filtrar, (marca)
Set Lista = Sheets("DATOS").Range("A1:A" & fin)
'Unicos hace referencia al rango de datos donde queremos copiar el resultado del filtro
'en este casos los registros únicos
Set Unicos = Sheets("DATOS").Range("D1")
'Procedemos a filtrar y copiar en los rangos establecidos.
'marcando Unique con "1" (True) indicamos que sean únicos.
Lista.AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Unicos, Unique:=1
'liberamos variables
Set Lista = Nothing
Set Unicos = Nothing
End Sub

Como podéis observar, hemos filtrado los datos de la columna “A” y los hemos pegado en la columna “D”. Y el resultado es el esperado, nos ha extraído los registros únicos y nuestro jefe o cliente ha quedado satisfecho:

EXTRAER REGISTROS ÚNICOS CON FILTRO AVANZADO EN VBA2

Pero (siempre hay un pero), resulta que ahora lo que necesita es filtrar los datos y obtener registros únicos de las dos columnas de Marca y Combustible, pero no de forma independiente, sino relacional. Es decir, que en el caso de Alfa Romeo solo han de aparecer dos registros, uno de Alfa Romeo Diesel y otro Alfa Romeo Gasolina. Esto no supone un problema, tan solo hemos de modificar los rango de nuestra macro, así:

Sub UNICOS_UN_RANGO()
'definimos las variables que vamos a utilizar como rango
Dim Lista, Unicos As Range
fin = Application.CountA(Sheets("DATOS").Range("A:A"))
'Lista hace referencia al rango de datos que queremos filtrar, es este caso Marca y combustible
Set Lista = Sheets("DATOS").Range("A1:B" & fin)
'Unicos hace referencia al rango de datos donde queremos copiar el resultado del filtro
'en este caso ha de ser el mismo tamaño de rango es decir 2 columnas con la misma longitud que Lista
'longitud que Lista. los datos se copiarán en F(marca) y en G(Combustible)
Set Unicos = Sheets("DATOS").Range("F1:G" & fin)
'Procedemos a filtrar y copiar en los rangos establecidos.
'marcando Unique con "1" (True) indicamos que sean únicos.
Lista.AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Unicos, Unique:=1
'liberamos variables
Set Lista = Nothing
Set Unicos = Nothing
End Sub

En el rango de datos a filtrar especificamos el que se trata de dos columnas A y B hasta el fin de datos y en el rango de salida (esto es importante) debemos especificar el mismo tamaño de rango, aunque sean columnas diferentes (pero deben ser dos, ser contiguas y tener el mismo largo). Una vez que pulsamos la macro, ya tenemos los datos que necesitamos, en las columnas  “F” y “G”:

EXTRAER REGISTROS ÚNICOS CON FILTRO AVANZADO EN VBA4

Es importante comentar que podemos mover esta información a cualquier parte de nuestro libro, solo hemos de especificar en el rango de salida, la hoja de destino.

Como siempre os dejo el archivo de ejemplo para que probéis las macros y las adaptéis a vuestros proyectos 🙂

Descarga el archivo de ejemplo pulsando en: EXTRAER REGISTROS ÚNICOS CON FILTRO AVANZADO EN VBA

Anuncios

Un pensamiento en “EXTRAER REGISTROS ÚNICOS CON FILTRO AVANZADO EN VBA

  1. Pingback: EXTRAER REGISTROS ÚNICOS CON UNA CONSULTA SQL USANDO DISTINCT | EXCEL SIGNUM

¿Te ha gustado?. Deja un comentario

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s