Eliminare doppioni da combobox
Hai un problema con Excel? 
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 |
Vuoi Approfondire?