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:
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”:
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:
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»:
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
Eres un maestro en esto, llevaba semanas buscando un código VBA para filtras valores únicos. Tu código ha sido el más simple y fácil de usar que he encontrado. Está muy bien explicado. Tengo casi nulo conocimiento en VBA, pero con tu explicación y lo simple de tu código, me resulto fácil modificarlo.
Muy buena macro, solo una pregunta ¿Cómo puedo seleccionar columnas separas?
Hola Patricio; con este método no se puede, si haces referencia a un rango deben ser columnas contiguas. Podrías hacerlo con una macro por columna donde el rango es solo una columna y llamar a cada macro con un call.
Saludos.
Hola, muy buena explicación, Quiro preguntarte, tengo una base filtrada por codigo, donde el mismo codigo puede tener varios valores(no repetidos) y los tengo que listar en una hoja, el problema que tengo es que me encuentra el codigo, me coloca el valor que trae ese codigo en la primer celda, pero los otros valores no los completa.Es decir no se como listar todos los valores encontrados que corresponden a ese codigo. Espero haber sido claro en la explicación de la duda. Gracias
Hola Carlos:
LA verdad es que la explicación no me ha quedado clara del todo, te agradecería me enviases un ejemplo de lo que necesitas, en una hoja los datos que tienes y en otra la información que deseas obtener, cuando más clara y descriptivo mejor.
Saludos
Gracias x responder, te lo envie por mail a info@…..Saludos
Buenas tardes,
Quizás sea la única a la que Excel hace el tonto, pero creo que merece la pena consultar…
He probado la macro que publica y funciona perfectamente pero, en mi caso, después de emplear la macro quiero hacer un conteo condicionado («CONTAR SI») y, tras insertar las fórmulas he visto que no funcionan (de hecho las fórmulas funcionan perfectamente en otra hoja así que no es cosa de las fórmulas).
Estudiando el porqué no funcionan las fórmulas he visto que, seleccione la celda que seleccione en la barra de fórmulas me aparece el dato que contiene la celda (el dato pegado por la macro). Pero si intento filtrar los datos de cada una de las columnas, al abrir el desplegable de filtro, aparece que la columna está vacía. Sé que éste error también aparece si la celda no está en formato TEXTO así que he probado a cambiar el formato de ambas columnas, primero a texto y luego a número pero siguen sin mostrarse resultados si intento filtrar los datos.
¿Sabe porqué sucede ésto? Pues entiendo que éste problema será el que me impide que la fórmula funcione
He formulado un contar.si sobre el resultado de la macro y ha funcionado perfectamente. Desconozco el problema que indicas, necesitaría ver un ejemplo del problama., Saludos
Hola excelente aporte! Muchas gracias de antemano, me funcionó muy bien la primera vez, pero al volver a utilizarlo me aparece el mensaje: “el rango de extraccion tiene un nombre de campo inexistente o no válido” ¿cómo puedo hacer que vuelva a funcionar?
Hola Eduardo:
En el ejemplo funciona perfectamente, y no he conseguido reproducir tu error. Verifica tu información y el nombre de los campos. Sin ver tus datos no puedo decirte cuál es el error.
Saludos.
Hola Segu buenos días gracias por compartir esta macro que resulta muy útil cuando desplegamos lista para búsquedas y nos encontramos con valores repetidos, de todos modos me encuentro con un problema ya que descargué tu archivo de ejemplo y funciona correctamente pero cuando transcribo la macro a mi hoja de calculo (otro archivo pero con el mismo nombre de hoja «DATOS») me aparece este error y no puedo entender la razón
fin = Application.CountA(Sheets(«DATOS»).Range(«A:A»))
Error de complilación
Se esperaba una función o una variable
Saludos desde Argentina!!!!
Hola Gerardo:
tendría que poder reproducir el error para poder examinarlo y ver el problema. Necesitaría que me enviases ejemplo con el problema.
Saludos
Buen dia Segu:
Excelente tu aporte, me ha ayudado muchisimo en la construccion de una macro para generar un resumen de facturacion. Resulta que necesito extraer la lista de datos unicos de una columna (J) pero filtrados por un valor presente en la columna I
Podrias ayudarme en como seria esa instruccion?. te agradezco muchisimo tu valiosa colaboracion. Saludos….