Combo trié sans doublon et suppression item dans listbox
Bonjour
Dans le fichier joint, en sélectionnant dans le combo une valeur, en découle les lignes correspondantes issues de la feuille BD
Une fois une ligne sélectionnée, je peux la supprimer (Bouton)
Je ne parviens pas :
* A lister dans le combo les valeurs de la colonne B de la feuille BD (triée et sans doublon)
* Supprimer une ligne via le bouton en faisant également aussitôt disparaitre de la listbox l'item (puisque la donnée source n'existe plus), sans pour autant réinitialiser le combo (je voudrai que l'on reste sur la valeur du combo que l'on était en train de traiter avant la suppression) ... Une sorte de réinitialisation de la listbox mais pas du combo
Je reste à votre disposition si je n'ai pas été suffisamment claire
Merci
bonsoir,
cf pj
Dim f
Private Sub UserForm_Initialize()
Set f = Sheets("BD")
Set mondico = CreateObject("Scripting.Dictionary")
a = f.Range("B2:B" & f.[A65000].End(xlUp).Row) ' tableau a(n,1) pour rapidité
For i = LBound(a) To UBound(a)
If a(i, 1) <> "" Then mondico(a(i, 1)) = ""
Next i
'--avec tri
temp = mondico.keys
Call Tri(temp, LBound(temp), UBound(temp))
Me.ComboBox1.List = temp
End Sub
Sub Tri(a, gauc, droi) ' Quick sort
ref = a((gauc + droi) \ 2)
g = gauc: d = droi
Do
Do While a(g) < ref: g = g + 1: Loop
Do While ref < a(d): d = d - 1: Loop
If g <= d Then
temp = a(g): a(g) = a(d): a(d) = temp
g = g + 1: d = d - 1
End If
Loop While g <= d
If g < droi Then Call Tri(a, g, droi)
If gauc < d Then Call Tri(a, gauc, d)
End SubUn RemoveItem dans la Listbox n'est pas suffisant. Si c'est le seul élément, il doit également être supprimé du ComboxBox.
Ceuzin
bonsoir,
Il faut évidemment extraire ta liste d'éléments uniques et la trier pour la mettre dans ta Combo.
Une suggestion :
Sub Test()
Dim n%
With Worksheets("BD")
.Range("M1:M1000").ClearContents
.Range("B1:B1000").AdvancedFilter xlFilterCopy, , .Range("M1"), True
n = .Range("M1").End(xlDown).Row
.Range("M2:M" & n).Sort key1:=.Range("M2"), order1:=xlAscending, Header:=xlNo
UserForm1.ComboBox1.List = .Range("M2:M" & n).Value
End With
UserForm1.Show
End SubVoilà qui t'affecte une liste triée d'éléments. Si tu veux qu'elle reste volatile, il suffira d'effacer la colonne M à la fin.
Pour test j'ai couplé l'affectation suivie de l'ouverture du Userform.
Mais tu peux la glisser dans ton Initialize (là la proc. Test la remplace) en en supprimant le Show final...
Pour ta 2e question, tu peux supprimer l'élément ListBox sans problème avec RemoveItem, c'est sans incidence sur le reste.
Cordialement.
Bonsoir
Merci à vous deux, c'est parfait.
Et en plus j'ai le choix entre 2 solutions différentes.
Bravo, vous êtes des chefs.
Merci encore