Como lleno una Combobox sin Campos duplicados?

Tengo el siguiente código, con el cual se genera una userform, en la cual hay 4 combobox, de los cuales 3 se rellenan desde el mismo cuadro de excel. El problema es que los valores que toma se suelen repetir, por tanto necesito que no muestre los valores duplicados. Crear tablas en diferentes hojas no es una opción posible. Gracias.

Option Explicit

Dim rango1, celda1 As Range
Dim rango2, celda2 As Range
Dim rango3, celda3 As Range

'llena el combobox de market
Private Sub userform_initialize()

Set rango1 = Range("TablaBase[[Purchasing org. '[Description']]]")
For Each celda1 In rango1
ComboBox1.AddItem celda1
Next celda1

'llena el combobox de año
Set rango2 = Range("TablaBase[Año]")
For Each celda2 In rango2
ComboBox2.AddItem celda2
Next celda2

'llena el combobox de mes
Set rango3 = Range("TablaBase[Mes]")
For Each celda3 In rango3
ComboBox3.AddItem celda3
Next celda3

'llena combobox de report type
ComboBox4. AddItem "Categories lv1"
ComboBox4. AddItem "Categories lv2"
ComboBox4. AddItem "Company"
ComboBox4. AddItem "Plants"
ComboBox4. AddItem "Suppliers"
ComboBox4. AddItem "Zone"

End Sub

3 respuestas

Respuesta
2

Prueba con la siguiente rutina Agregar( ), lo que hace es comparar cada dato que se va a agregar al combo, si ya existe en el combo ya no lo agrega. También te lo ordena de forma ascendente.

Option Explicit
Dim rango1, celda1 As Range
Dim rango2, celda2 As Range
Dim rango3, celda3 As Range
'llena el combobox de market
Private Sub userform_initialize()
    Set rango1 = Range("TablaBase[[Purchasing org. '[Description']]]")
    For Each celda1 In rango1
        Call Agregar(ComboBox1, celda1.Value)
    Next celda1
    'llena el combobox de año
    Set rango2 = Range("TablaBase[Año]")
    For Each celda2 In rango2
        Call Agregar(ComboBox2, celda2.Value)
    Next celda2
    'llena el combobox de mes
    Set rango3 = Range("TablaBase[Mes]")
    For Each celda3 In rango3
        Call Agregar(ComboBox3, celda3.Value)
    Next celda3
    '
    'llena combobox de report type
    ComboBox4. AddItem "Categories lv1"
    ComboBox4. AddItem "Categories lv2"
    ComboBox4. AddItem "Company"
    ComboBox4. AddItem "Plants"
    ComboBox4. AddItem "Suppliers"
    ComboBox4. AddItem "Zone"
End Sub
'
Sub Agregar(combo As ComboBox, dato As String)
'Por.Dante Amor
    Dim i
    For i = 0 To combo.ListCount - 1
        Select Case StrComp(combo.List(i), dato, vbTextCompare)
            Case 0: Exit Sub 'ya existe en el combo y ya no lo agrega
            Case 1: combo.AddItem dato, i: Exit Sub 'Es menor, lo agrega antes del comparado
        End Select
    Next
    combo.AddItem dato 'Es mayor lo agrega al final
End Sub

.

'S aludos. Dante Amor. Recuerda valorar la respuesta. G racias

.

Avísame cualquier duda

.

hola, disculpa, si utilizo ese código me dice que no está definido, debe ser agregado al final como escribiste?

Sí, también tienes que poner la función Agregar( ) dentro dentro del userform

.

'S aludos. Dante Amor. Recuerda valorar la respuesta. G racias

.

Disculpa que te siga molestando, ¿cómo agrego la función "agregar"? No tengo mucha experiencia con VBA

Solamente borra tu macro y pon todo el código que yo te envié.

O envíame tu archivo para adaptar el código

Mi correo [email protected]

En el asunto del correo escribe tu nombre de usuario “Erick Ravelo

.

'S aludos. Dante Amor. Recuerda valorar la respuesta

Va el código, borra todo tu código y pon el siguiente:

Private Sub userform_initialize()
    'llena el combobox de market
    Set rango1 = Range("TablaBase[Market]")
    For Each celda1 In rango1
        Call Agregar(ComboBox1, celda1.Value)
    Next celda1
    'llena el combobox de año
    Set rango2 = Range("TablaBase[Año]")
    For Each celda2 In rango2
        Call Agregar(ComboBox2, celda2.Value)
    Next celda2
    'llena el combobox de mes
    Set rango3 = Range("TablaBase[Mes]")
    For Each celda3 In rango3
        Call Agregar(ComboBox3, celda3.Value)
    Next celda3
    'llena combobox de report type
    ComboBox4. AddItem "Categories lv1"
    ComboBox4. AddItem "Categories lv2"
    ComboBox4. AddItem "Company Code"
    ComboBox4. AddItem "Plants"
    ComboBox4. AddItem "Vendor"
    ComboBox4. AddItem "Zone"
    'ComboBox4. AddItem ""
    'ComboBox3. AddItem ""
    'ComboBox2. AddItem ""
    'ComboBox1. AddItem ""
End Sub
'
Sub Agregar(combo As ComboBox, dato As String)
'Por.Dante Amor
    Dim i
    For i = 0 To combo.ListCount - 1
        Select Case StrComp(combo.List(i), dato, vbTextCompare)
            Case 0: Exit Sub 'ya existe en el combo y ya no lo agrega
            Case 1: combo.AddItem dato, i: Exit Sub 'Es menor, lo agrega antes del comparado
        End Select
    Next
    combo.AddItem dato 'Es mayor lo agrega al final
End Sub
'Usar Boton cancelar
Private Sub CommandButton2_Click()
Unload Me
End Sub

.

'S aludos. Dante Amor. Recuerda valorar la respuesta
Respuesta

Le hice unas leves modificaciones a tu macro, le puse tres colecciones con indice, si el dato es repetido no lo cargara en los comboboxs

Option Explicit
Dim unicos As New Collection
Dim unicos2 As New Collection
Dim unicos3 As New Collection
Dim rango1, celda1 As Range
Dim rango2, celda2 As Range
Dim rango3, celda3 As Range
'llena el combobox de market
Private Sub userform_initialize()
Set rango1 = Range("TablaBase[[Purchasing org. '[Description']]]")
For Each celda1 In rango1
celd1 = celda1
On Error Resume Next
unicos.Add celd1, CStr(celd1)
If Err.num = 0 Then ComboBox1.AddItem celd1
On Error GoTo 0
Next celda1
'llena el combobox de año
Set rango2 = Range("TablaBase[Año]")
For Each celda2 In rango2
celd2 = celda2
On Error Resume Next
unicos2.Add celd2, CStr(celd2)
If Err.num = 0 Then ComboBox2.AddItem celd2
On Error GoTo 0
Next celda2
'llena el combobox de mes
Set rango3 = Range("TablaBase[Mes]")
For Each celda3 In rango3
celd3 = celda3
On Error Resume Next
unicos3.Add celd3, CStr(celd3)
If Err.num = 0 Then ComboBox3.AddItem celd3
On Error GoTo 0
Next celda3
'llena combobox de report type
ComboBox4. AddItem "Categories lv1"
ComboBox4. AddItem "Categories lv2"
ComboBox4. AddItem "Company"
ComboBox4. AddItem "Plants"
ComboBox4. AddItem "Suppliers"
ComboBox4. AddItem "Zone"

Hola, el código me dice que no esta definido celd1, si corrijo eso me dice que falta el with, y luego me dice que falta el objeto... disculpa, no soy un experto en VBA por eso me cuesta un poco entender el código, ¿tienes alguna otra idea?

¿Puedes poner la línea en donde te marca error? ¿O de preferencia subir una captura de pantalla el error?, un problema viene cuando usas option explicit te fuerza a declarar las variables, por ejemplo las celd1, celd2, y celd3, en cuanto al with en esta parte del macro no lo tienes y según veo los ciclos for next están cerrados y los if también, ¿cuál objeto te dice que falta?

Respuesta

Esto te puede aportar algo más

https://youtu.be/sWrUt9kItsg

Visita http://programarexcel.com descarga cientos de ejemplos que puedes usar para automatizar tus libros de Excel

Suscribe a https://youtube.como/programarexcel y recibirás en tu mail las nuevas macros que se agreguen

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas