Combobox sin duplicados en vba

Respuesta de
a
Usuario
En excel tengo una columna con datos repetidos, en un form tengo un combo que debe contener los registros de esa columna pero sin que se repitan.
Mi intención es usar un código que recorra los registros y que por cada uno de ellos compruebe si ya existe en la lista del combo, si existe, entonces se añadirá. Pero no se ni como empezar.
Mi idea es algo más o menos así:

for each reg in range("a1:a5")
if [ya existe]= false then
combobox1.additem reg
end if
next

'ya existe = busqueda en la lista del combo
Experto
Hola Spinal!

No vas nada mal con tu razonamiento. Solamente lo he desarrollado un poco más.

El siguiente ejemplo creo que soluciona tu problema.

Comenzamos declarando un nuevo objeto del tipo "Collection" y al que denominaremos "ElementosUnicos".

Asume que el rango llamado "Datos" contiene una lista de elementos, algunos de los cuales podrían estar duplicados.

El código que te muestro hace un "Loop" a través de las celdas en el rango y añade un valor de celda a la colección "ElementosUnicos".

Usar la declaración "On Error Resume" hace que VBA ignore el error que ocurre si el dato no es único. Cuando ocurre un error, no se añade a la colección (que es justo lo que queremos).

A partir de ahí, el procedimiento transfiere los elementos no duplicados de la colección "ElementosUnicos" al cuadro de lista.

****** CODIGO ********

Sub BorrarDuplicados()

Dim TodaslasCeldas As Range, Celda As Range
Dim ElementosUnicos As New Collection

On Error Resume Next
For Each Celda In Range("Datos")
ElementosUnicos.Add Celda.Value, CStr(Celda.Value)
Next Celda
On Error GoTo 0

'Añadir elementos no duplicados a un Cuadro de lista.
For Each Item In ElementosUnicos
UserForm1.ListBox1.AddItem Item
Next Item

'Mostrar el número de entradas en el ListBox1.
UserForm1.Label1.Caption = _
"Elementos únicos: " & ElementosUnicos.Count

'Mostrar el UserForm
UserForm1.Show

End Sub

****** FIN DEL CODIGO ******

Créate un UserForm con un ListBox y un Label (te aconsejo que también te crees un botón de "ACEPTAR" y otro de "CANCELAR").

Espero que esto solucione tu problema.

Un saludo!

César M.C.M.
Usuario
Eso soluciona mi problema... pero tengo una duda: ¿El objeto collection no admite registros duplicados?
Experto
Hola Spinal!

Efectivamente no los admite.

Por eso aprovechamos esa circunstancia y en el código desarrollado introducimos "On Error Resume Next". Esta instarucción motiva que VBA ignore el error que ocurre si el registro no es único. Cuando ocurre un error, no se añade el elemento a la colección (que es justo lo que queremos).

Un saludo!

César M.C.M.