¿Cómo puedo evitar agregar items repetidos a un ListBox? O ¿Cómo eliminar los items repetidos de un ListBox? Para Dante Amor

Mi caso es que tengo un UserForm con un ListBox en el cual agrego items que traigo de una hoja de Excel, mi problema esta es que algunos de estos items se repiten y yo solo quiero que me muestre los que no son repetidos, los items que yo traigo son una cadena de caracteres, por ejemplo:

Aaaa-ffff-eee-ccc-111-2014

Creo yo que se tiene que comparar la cadena completa con los demás.

PD. La ocasión pasada tu me ayudaste a ingresar los distintos valores que le corresponden a un dato y me brindaste le siguiente código, no se si habrá forma de agregarle algo para que antes de ingresarlos me valide las cadenas y no me muestre las que son repetidas (cuando se presente el caso) o de lo contrario que otro código podría utilizar, llevo días intentándolo pero no logro realizarlo, en verdad agradecería mucho tu ayuda. Saludos!

Private Sub ComboBox1_Change()
'Por.DAM
    For i = 2 To Range("A" & Rows.Count).End(xlUp).Row
        If Cells(i, "A") = ComboBox1 Then
            ListBox1.AddItem Cells(i, "B")
        End If
    Next
End Sub

2 respuestas

Respuesta
4

Te anexo el código para cargar los tipos en el combo y los colores en el listbox, los datos deberían estar según la imagen:

Este es el código

Dim valores As New Collection
Sub agregarList(dato)
'por.DAM agrega los datos únicos y en orden alfabético
    For i = 1 To valores.Count
        Select Case StrComp(valores(i), dato, vbTextCompare)
        Case 0: Exit Sub 'ya existe, no lo agrega
        Case 1: valores.Add dato, Before:=i: Exit Sub 'agrega antes
        End Select
    Next
    valores.Add dato 'lo agrega al final
End Sub
Private Sub ComboBox1_Change()
'por.Dante Amor
    ListBox1.Clear
    For i = 2 To Range("A" & Rows.Count).End(xlUp).Row
        If Cells(i, "A") = ComboBox1 Then
            agregarList Cells(i, "B")
        End If
    Next
    For Each f In valores
        ListBox1.AddItem f
    Next
    Set valores = Nothing
End Sub
Private Sub UserForm_Activate()
'por.Dante Amor
    For i = 2 To Range("A" & Rows.Count).End(xlUp).Row
        agregar ComboBox1, Cells(i, "A")
    Next
End Sub
Sub agregar(combo As ComboBox, dato As String)
'por.Dante Amor agrega los item únicos y en orden alfabético
    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

Saludos.Dante Amor

No olvides valorar la respuesta.

Hola de nuevo

Perdón pero creo que no me explique, en mi caso estoy trabajando con folios (por ejemplo un folio es REDT-EEE-GGG-345-2014) éstos folios los traigo a un listbox con ayuda del código anterior que me brindaste, solo que se me presento el caso que alguno de los folios se repite y yo solo quiero que me muestre uno, como te había mencionado antes creo que seria más fácil que hiciera una comparación de los items que están dentro del listbox y me borrara los duplicados, la otra forma seria que comparara antes de ingresarlos al listbox pero veo más conveniente la primera opción. Espero que esta vez si me haya explicado, Agradezco mucho tu ayuda.

Saludos! :D

Disculpa, pero no me queda claro como tienes los datos.

Podrías enviarme tu archivo con el formulario y me pones en hojas diferentes lo que quieres que se cargue en el combo y lo que esperas que se cargue en el listbox.

Quisiera enviarlo pero estoy trabajando con información confidencial :) pero puedo explicarte más claro que es lo que tengo.

Mira en mi hoja de excel tengo estas columnas:

    Rerencia                         Oficio

casaroja2014         PPP-RRR-EEE-123-2014

casaroja2014         PPP-RRR-EEE-123-2014

casaroja2014         PPP-OOO-FFF-883-2014

casaroja2014         PPP-NNN-AAA-589-2014

autoazul2014         AAA-NNN-QQQ-111-2014

En un UserForm el usuario elige el tipo (con un combobox), color (lo ingresa en textbox) y año (lo ingresa en otro textbox), con estos datos que ingresa el usuario se crea una variable (llamada referencia) que concateno de estas 3 opciones con lo cual se crea la Referencia, con ayuda de tu primer código traigo los oficios que corresponden a esa referencia, de la siguiente forma:

Private Sub CommandButton1_Click()
'Por.DAM
    For i = 2 To Range("A" & Rows.Count).End(xlUp).Row
        If Cells(i, "A") = referencia Then
            ListBox1.AddItem Cells(i, "B")
        End If
    Next
End Sub

y al darle  click a un Botón que llamo Buscar me trae los que corresponden a la Referencia pero si notas en mi ejemplo que te puse arriba 1 ofico se repite y yo solo quiero que me muestre 1 de los dos.

Espero me haya explicado, sino te dijo más cosas

Gracias por la ayuda :D

No me envíes la información tal cual, pero necesitaría datos reales, de filas y columnas.

Por ejemplo si tienes un factura con número n1234, no pongas n1234, pon otro número que inventes "sdf34", de esa forma tu información está protegida.

Y en otra hoja me pones que esperas cargar en el listbox, yo te puse una imagen muy clara, tengo 5 autos, 2 verdes, 2 rojos y 1 azul, cuando elijo en el combobox auto, en el autofiltro me aparecen solamente los colores azul, rojo y verde.

Si seguimos con datos ficticios no podré entender.

Estaba analizando el ejemplo que pusiste y eso es precisamente lo que hace mi macro, lee todos los registros de la columna A que correspondan a casaroja2014 y en el listbox solamente va a poner los únicos de la columna B.

Pero mi formulario o la idea de mi formulario no tiene botones, la búsqueda se realiza en automático cuando seleccionas un dato del combobox1. Por eso, tendría que ver tu formulario para ver cómo tienes los controles y adaptar el código.

Así quedaría la macro

Dim valores As New Collection
Private Sub CommandButton1_Click()
'Mod.Por.Dante Amor
    Select Case ComboBox1
        Case "Casa":      tipo = "casa"
        Case "Automovil": tipo = "auto"
    End Select
    referencia = tipo & TextBox1 & TextBox2
    ListBox1.Clear
    For i = 2 To Range("A" & Rows.Count).End(xlUp).Row
        If Cells(i, "A") = referencia Then
            agregarList Cells(i, "B")
        End If
    Next
    For Each f In valores
        ListBox1.AddItem f
    Next
    Set valores = Nothing
End Sub
Sub agregarList(dato)
'Mod.Por.Dante Amor
    For i = 1 To valores.Count
        Select Case StrComp(valores(i), dato, vbTextCompare)
        Case 0: Exit Sub 'ya existe, no lo agrega
        Case 1: valores.Add dato, Before:=i: Exit Sub 'agrega antes
        End Select
    Next
    valores.Add dato 'lo agrega al final
End Sub

¡Gracias! Muchas gracias, no sabes como me ayudaste :D te quedo excelente!

Saludos!! :) 

Podrías cambiar la valoración de la respuesta.

Al final de mi respuesta dice: “Es una buena respuesta” y puedes seleccionar una de 3 opciones:

  • Excelente
  • Si
  • No

ya quedó, gracias

Respuesta

Viejo quizás te sirva esto a mi me pasaba lo mismo mira el código

Sub Carga_data_insert()
If ComboHojas.ListCount > o Then
ComboHojas.Clear
GoTo Cargar
Else
GoTo Cargar

End If
Cargar:
Dim hoja As Worksheet
For Each hoja In ActiveWorkbook.Sheets
ComboHojas.AddItem hoja.Name

Next hoja
Set hoja = Nothing

End Sub

Sub Carga_data_insert()
If ComboHojas.ListCount > o Then
ComboHojas.Clear
GoTo Cargar
Else
GoTo Cargar

End If
Cargar:
Dim hoja As Worksheet
For Each hoja In ActiveWorkbook.Sheets
ComboHojas.AddItem hoja.Name

Next hoja
Set hoja = Nothing

End Sub

Este código agrega las hojas del libro al combo pero puedes adaptarlo y donde esta la etiqueta de cargar colocas tu código

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas