Eliminare doppioni da combobox



  • Eliminare doppioni da combobox
    di Massi data: 20/04/2017 10:04:14

    Buongiorno a tutti.

    Vorrei aggiungere ad una combobox i valori di una colonna appartenente ad una tabella presente nel foglio "database".
    Il problema è che mi aggiunge tutti i valori entro un determinato range, mentre vorrei che togliesse tutti i duplicati.
    Non ho idea di come fare.

    Ora ad esempio la combobox si riempie con i valori: a,b,c,a,b,e,d,f,a,a,a,b,g
    Vorrei che diventasse: a,b,c,e,d,f,g
    O ancora meglio ordinata alfabeticamente: a,b,c,d,e,f,g

    Grazie per l'aiuto!
     
    Private Sub CommandButton4_Click()
    
        Me.ComboBox1.Enabled = True
        Me.ComboBox1.Clear
    
        For conta1 = 3 To Sheets("Database").Cells(Rows.Count, 2).End(xlUp).Row
            If Sheets("Database").Cells(conta1, 2) = "Vite" Then
                Exit For
            End If
        Next conta1
        For conta2 = conta1 To Sheets("Database").Cells(Rows.Count, 2).End(xlUp).Row
            If Sheets("Database").Cells(conta2, 2) <> "Vite" Then
                Exit For
            End If
        Next conta2
        
        Dim rangevite As Range, cellavite As Range
        Set rangevite = Sheets("Database").Range("C" & conta1 & ":C" & conta2 - 1)
        For Each cellavite In rangevite
            If cellavite.Value <> "" Then Me.ComboBox1.AddItem cellavite.Value
        Next
        
    End Sub
    



  • di alfrimpa (utente non iscritto) data: 20/04/2017 11:19:00

    Ciao Massi

    Prova ad allegare un piccolo file di esempio con dati (non sensibili) spiegazione (anche se l'hai già data sul forum) ed indica il risultato che vuoi ottenere.

    In genere per popolare una combo/listbox con dati univoci si utilizza una collection.

    Per quanto riguarda l'ordinamento prima di caricare la combo si può fare l'ordinamento sui dati.

    Posta comunque un file e vediamo.

    Alfredo





  • di alfrimpa data: 20/04/2017 11:21:27

    Non so perché ma non ero loggato al forum quando ho risposto.

    Alfredo





  • di Massi data: 20/04/2017 12:35:03

    Ciao Alfredo,
    (la tua reputazione ti precede, puoi anche non loggarti, ahahah!)

    Allego file di esempio.
    Ho semplificato quello che sarà la userform finale ma il concetto è lo stesso.
    Inoltre ho aggiunto una problematica, descritta nei commenti del codice qui sotto.

    Grazie mille.

    P.S. Ogni volta che chiudo la userform (anche subito dopo averla aperta, senza aver fatto nulla) mi esce il messaggio di "memoria esaurita". Non capisco dove sia il problema. 
    Edit: problema risolto chiudendo e riaprendo il file
     
    Private Sub CommandButton1_Click()
        
        Me.ComboBox1.Enabled = True
        Me.ComboBox1.Clear
        
        For conta1 = 1 To Sheets("Database").Cells(Rows.Count, 2).End(xlUp).Row
            If Sheets("Database").Cells(conta1, 2) = "ciccio" Then
                Exit For
            End If
        Next conta1
        For conta2 = conta1 To Sheets("Database").Cells(Rows.Count, 2).End(xlUp).Row
            If Sheets("Database").Cells(conta2, 2) <> "ciccio" Then
                Exit For
            End If
        Next conta2
        
        Dim rangeciccio As Range, cellaciccio As Range
        Set rangeciccio = Sheets("Database").Range("C" & conta1 & ":C" & conta2 - 1)
        
        For Each cellaciccio In rangeciccio
            If cellaciccio.Value <> "" Then Me.ComboBox1.AddItem cellaciccio.Value
        Next
    
        Me.ComboBox1.Value = "Scegli dall'elenco"
    
        'ora nella mia combobox ovviamente appare sei volte "tizio" e una volta "caio"
        'mentre vorrei che apparisse una volta sola "tizio" e una volta sola "caio" senza duplicati
        'inoltre, diversamente da come scritto nel post precedente,
        'non è fondamentale che siano ordinati alfabeticamente
        
    End Sub
    
    
    
    
    Private Sub ComboBox1_Change()
    
        If Me.ComboBox1.Value <> "Scegli dall'elenco" Then
            Me.ComboBox2.Enabled = True
        Else
        End If
        
        
        'una volta abilitata la comboBox2 e ammettendo che dalla combobox1 scelgo "tizio"
        'vorrei che nella combobox 2 venissero elencati solo i valori della colonna "prova5"
        'corrispondenti alle righe dove è presente "tizio" nella colonna "prova3"
        'e "ciccio" nella colonna "prova2" (perché ho cliccato sul pulsante "ciccio")
        'e "pippo" nella colonna "prova1" (perché sono nella multipag "pippo")
        'riassumendo in combobox2 dovrebbero comparire i valori:
        'ciccio_tizio_1, ciccio_tizio_2, ciccio_tizio_3, ciccio_tizio_4, ciccio_tizio_5, ciccio_tizio_6
        'e nessun altro valore
    
    End Sub
    
    
    
    
    Private Sub CommandButton3_Click()
    
        'quando clicco su inserisci mi scrive sul foglio di lavoro il valore della combobox2 selezionato
        If ComboBox2.Value <> "" Then
        Sheets("Database").Range("A20").Value = ComboBox2.Value
        Else
        End If
    
    End Sub
    
    
    
    
    Private Sub UserForm_Activate()
        Me.ComboBox1.Enabled = False
        Me.ComboBox1.Clear
        Me.ComboBox2.Enabled = False
        Me.ComboBox2.Clear
    End Sub
    



  • di alfrimpa data: 20/04/2017 12:43:21

    Ciao Massi ti ringrazio.

    La mia reputazione mi potrà anche precedere ma non è scontato che possa risolvere il problema

    Mi devi dare un po' di tempo perché in questo periodo non ho molto tempo da dedicare ai forum.

    Comunque se qualcun altro (nel frattempo) vuole intervenire non c'è alcun problema.

    Alfredo





  • di Luca73 data: 20/04/2017 13:37:06

    Ciao
    anche se non sono all'altezza di Alfredo (CIAO) provo ad aiutarti
    Per la non ripetizione io farei qualcosa tipo quello sotto
    Ciao
    Luca
     
    For Each cellaciccio In rangeciccio
            If cellaciccio.Value <> "" Then Me.ComboBox1.AddItem cellaciccio.Value
    Next
    
    sostituito con
    
    For Each cellaciccio In rangeciccio
            If cellaciccio.Value <> "" Then
                If cellaciccio.Address = rangeciccio.Cells(1, 1).Address Then
                    Me.ComboBox1.AddItem cellaciccio.Value
                Else
                    TrovatoCellaciccioLT = False
                    For Each cellaciccioLT In Range(rangeciccio.Cells(1, 1), cellaciccio.Offset(-1, 0))
                        If cellaciccioLT = cellaciccio Then
                            TrovatoCellaciccioLT = True
                            Exit For
                        End If
                    Next
                    If Not TrovatoCellaciccioLT Then
                        Me.ComboBox1.AddItem cellaciccio.Value
                    End If
                End If
            End If
            'Me.ComboBox1.AddItem cellaciccio.Value
        Next






  • di alfrimpa data: 20/04/2017 13:52:32

    Ciao Luca

    Cit.: "anche se non sono all'altezza di Alfredo (CIAO) provo ad aiutarti"

    Ma va la Luca sai benissimo che stai dicendo una sciocchezza

    Solo una curiosità: perché non hai usato una collection per il popolamento con dati univoci della combo?

    Sotto ti mostro un esempio trovato in rete (certo non mio) che ho usato spesso.

    Un caro saluto.

    Alfredo
     
    Sub CreaElencoUnivoco()
     Dim CL As Range, Intervallo As Range, Elenco As New Collection
     Dim Valori As Variant
     Worksheets("Foglio1").Select
     Set Intervallo = Range("A1", Range("A1").End(xlDown))
     On Error Resume Next
     For Each CL In Intervallo
    Elenco.Add CL.Value, CStr(CL.Value)
     Next
     On Error GoTo 0
     With Worksheets("Foglio1")
    .ComboBox1.Clear
    For Each Valori In Elenco
    .ComboBox1.AddItem Valori
    Next
     End With
     End Sub 






  • di Luca73 data: 20/04/2017 14:12:23

    Per riempire la ComboBox 2 e altre modifiche vedi il file allegato con i miei commenti
    Ciao
    Luca





  • di Luca73 data: 20/04/2017 14:14:25

    @ alfredo
    perche non sono alla tua altezza...
    scherzi a parte perchè io di solito la perte di userform ecc la uso pochissimo e pertanto non la conosco così bene. e allora utilizzo soluzioni meno fini....

    Grazie del suggerimento


    Ciao
    Luca





  • di Massi data: 20/04/2017 14:50:54

    provo i codici e vi aggiorno se ho risolto il problema.
    grazie ad entrambi!



  • di Massi data: 09/05/2017 12:19:39

    Scusate il ritardo, ma tra ponti e fiere non ho avuto tempo di lavorare a questo codice.
    Provando e riprovando alla fine sono riuscito a ottenere quello che volevo usando la collection.
    Grazie mille!
     
        Dim j_CB1 As Long
        Dim k_CB1 As Long
        Dim Intervallo_CB1 As Range
        Dim CL_CB1 As Range
        Dim Elenco_CB1 As New Collection
        Dim Valori_CB1 As Variant
        Set Intervallo_CB1 = Range("F" & j_CB1 & ":F" & k_CB1 - 1)
        On Error Resume Next
        For Each CL_CB1 In Intervallo_CB1
            Elenco_CB1.Add CL_CB1.Value, CStr(CL_CB1.Value)
        Next
        On Error GoTo 0
        With Worksheets("Database")
            Me.ComboBox2.Clear
            Me.ComboBox2.Enabled = True
            For Each Valori_CB1 In Elenco_CB1
                Me.ComboBox2.AddItem Valori_CB1
            Next
        End With