Hola a todos!
El universo de los datos duplicados y su tratamiento es muy variado en Excel, se pueden tratar tanto con fórmulas, con comandos instalados en la hoja y también con vba. El objetivo suele ser siempre trabajar con registros únicos para evitar duplicidades en las informaciones.
En esta web hay varios ejemplos de cómo se pueden obtener registros únicos, hoy os voy a mostrar una nueva variante. Imaginad que tenéis los meses del año en una columna, pero en algunos casos se duplica el nombre de los meses:
El objetivo será obtener registros únicos y cargar un combobox y un listbox. Para ello vamos a trabajar con la siguiente macro:
Sub CARGAR_UNICOS()
'Declaramos las variables
Dim rango As Range, oDic As Object, celda As Object
Dim ipalabra As String, matriz1 As Variant, matriz2 As Variant
Dim sCadena1 As String, sCadena2 As String, i As Long, j As Long, Fin As Integer
'Trabajamos con la hoja
With Sheets("UNICOS")
'Limpiamos combo y listbox
.ComboBox1.Clear
.ListBox1.Clear
'Definimos el rango de los datos
Fin = .Range("A" & Rows.Count).End(xlUp).Row
'Trabajamos con rango establecido y creamos objeto diccionario
Set rango = .Range("A2:A" & Fin)
Set oDic = CreateObject("scripting.dictionary")
'Por cada celda con datos en el rango rango componemos un string
For Each celda In rango
If celda <> vbNullString Then
ipalabra = ipalabra & "," & celda
End If
Next celda
'Eliminamos posibles espacios en blanco
sCadena1 = Trim(Mid(ipalabra, 2, Len(ipalabra)))
'Comprobamos que cada palabra que incluimos en la matriz no existe en cadena
matriz1 = Split(sCadena1, ",")
For i = 0 To UBound(matriz1)
If Not oDic.Exists(matriz1(i)) Then oDic.Add matriz1(i), matriz1(i)
Next i
'Creamos una nueva cadena ya sin duplicados
sCadena2 = Join(oDic.Keys, ",")
matriz2 = Split(Trim(sCadena2), ",")
'Pasamos los datos al Combo y al listbox
For j = 0 To UBound(matriz2)
.ComboBox1.AddItem (matriz2(j))
.ListBox1.AddItem (matriz2(j))
Next
'Liberamos memoria
Set rango = Nothing
Set oDic = Nothing
End With
End Sub
Lo que estamos haciendo con este código es: pasar los datos del rango a una variable string con todos los meses (incluidos los repetidos) en una cadena de texto. Si en ese rango existen celdas sin información, no las tendremos en cuenta.
Con el objeto «scripting.dictionary» y mediante un loop, comprobamos si cada palabra «no» existe, en caso afirmativo, la incorporamos de nuevo a la «matriz1». De esta forma controlamos que no aparezcan registros duplicados en nuestros datos.
A continuación, pasamos los datos a una string y de nuevo a una matriz (matriz2), que nos permitirá con un loop cargar los datos en el Combobox1 y en el Listbox1.
En las partes del código donde hago mención al uso de la coma como delimitador «,» es necesario su utilización para delimitar los elementos de la celda. Si usásemos un espacio en blanco pasaría la segunda, tercera o n palabra como si fuesen otra celda (que puede que también os sea de utilidad para obtener únicos en una única celda).
El resultado es el siguiente:
Como podéis observar, los datos se han cargado correctamente y sin duplicados. Por cierto, para que realicéis pruebas he adjuntado una sencilla macro para vaciar el combobox y el listbox que está vinculada al botón «Vaciar Combo y Listbox».
Y eso es todo, espero que este método os resulte de interés : )
Descarga el archivo de ejemplo pulsando en: ELIMINAR REGISTROS DUPLICADOS Y CARGAR DATOS UNICOS EN COMBOBOX Y LISTBOX
¿Te ha resultado de interés?, puedes apoyar a Excel Signum con una pequeña donación.
¡¡Muchas gracias!!
Hola, muy interesante si en ocaciones se requiere de una formula rapida de eliminar duplicados y es muy util. Ahora, si en lugar de cargar a un listbox en otras celda de la misma hoja o en otra hoja, como seria el codigo de la macro?. Otra variante seria que en lugar de una sola columna de datos se tuvieran dos o mas y las duplicadas estuvieran en la columna A.
Gracias, saludos ojala pudiera compartirlo con esas variantes que seran de mucha ayuda.
Hola Victor:
Para pasar los datos a la hoja, solo tienes que modificar la parte del final de la macro, en lugar de pasar los datos a un combobox, los pasas a la utilizando el mismo loop, sustituye con este código la parte final de la macro en la que pasamos los datos al combo y al listbox.
Con esta modificación, los datos se muestran a partir de B2 (por si tienes encabezado).
'Pasamos los datos a la hoja
For j = 0 To UBound(matriz2)
.Cells(j + 2, 2) = matriz2(j)
Next
'Liberamos memoria
Sobre el tema de dos o más columna, has de tener muy en cuenta, que normalmente estamos hablando de datos relacionales, y te recomiendo estos post:
https://excelsignum.com/2017/06/22/extraer-registros-unicos-de-un-rango-de-datos/
https://excelsignum.com/2017/03/19/extraer-registros-unicos-con-una-consulta-sql-usando-distinct/
https://excelsignum.com/2016/06/23/extraer-registros-unicos-con-filtro-avanzado-en-vba/
Aquí tienes varios ejemplos, con diferentes métodos para extraer duplicados de varias columnas o rangos. Especialmente los dos últimos se refieren a datos relacionales.
Saludos.
Estimado, el combobox tiene alguna propiedad que me permita seleccionar un elemento solo una vez, evitando asi duplicados??
Muchas gracias!
No, es necesario programarlo. En esta web tienes ejemplos que encontrarás. Con el buscador los verás rápido.