(Résolu) Ajouter un item à une list en s'assurant que l'item n'y figure pas déjà

romrom

XLDnaute Nouveau
Bonjour le forum !!!
j'explique mon soucis : J'ai un userform, lorsque je clique un bouton, je souhaite que la combobox qui lui est liée ce charge des items contenus dans maplage (range déclarée dans la macro). Mais celle ci contenant énormément de doublon, j'ai élaboré une boucle FOR EACH cell afin de déterminer si la valeur de chaque cellule est déjà incluse dans ma list, si oui : passer à la suivante, si non : l'intégrer à la liste.

Ce que je ne parviens pas à faire, c'est consulter les items de ma list pour voir ce celui que je souhaite y ajouter n'y existe pas déjà. J'ai regarder d'autre truc du genre "charger les listes sans doublons mais j'ai pas réussi à tout comprendre (j'ai appris VBA sur le tare). J'ai mis la portion de mon code qui me laisse perplexe ci dessous, si quelqu'un dispose d'une idée simple pour m'aider à régler ce problème ça serait formidable !!!

En espérant avoir été clair et en vous remerciant

Rom

Private Sub CommandButton1_Click()

Dim plage As Range
Dim cell As Range

Sheets("BDD").Activate
f = ActiveSheet.UsedRange.Rows.Count
Set maplage = ActiveSheet.Range(Cells(1, 3), Cells(f, 3))

For Each cell In maplage.Cells
If cell.Value !!!!! C'est la que je bloque !!!! je souhaite demander "IF NOT cell.value appartient déjà à combobox1.list THEN Then
ComboBox1.AddItem (cell.Value)
End If
Next
End Sub
 
Dernière édition:

BOISGONTIER

XLDnaute Barbatruc
Repose en paix
Re : Ajouter un item à une list en s'assurant que l'item n'y figure pas déjà

Bonjour,

Le + performant est de préparer une liste sans doublons dans un dictionnaire.

Code:
Private Sub UserForm_Initialize()
  Set f = Sheets("BD")
  Set mondico = CreateObject("Scripting.Dictionary")
  a = f.Range("A2:A" & 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
  Me.ComboBox1.List = MonDico.keys
End Sub

JB
 

romrom

XLDnaute Nouveau
Re : Ajouter un item à une list en s'assurant que l'item n'y figure pas déjà

Merci à vous les amis !!! Myta : simple et efficace comme j'aime, ta méthode marche (d'ailleurs je m'en veux de pas y avoir penser plutôt !!!). JB merci à toi aussi, je me suis perdu un peu en lisant ta portion de code mais ça a l'air intéressant je vais approfondir et essayé de reprendre
 

romrom

XLDnaute Nouveau
Re : Ajouter un item à une list en s'assurant que l'item n'y figure pas déjà

Re les gens !!! JB j'ai finalement mis les mains dans le cambouis et ai utilisé une technique s'apparentant à la tienne. J'ai créé un tablo() (grace à un exemple trouver sur le net) voir code ci dessous. Ce dernier me génère ma liste et dans l'ordre alphabétique s'il vous plait :) . Il se trouve que je dois à chaque fois rentrer une valeur quelconque, pour initier ma liste (dans cet exemple : cells(1,1) ). EN remaniant un peu le code, j'ai réussi à faire en sorte que la valeurs de cell(1,1) soit toujours = tablo(1) (malgré l'ordre alphabétique). Je voudrais maintenant savoir comment supprimer cette valeur de la liste. Existe il une commande genre "tablo(1).errase" ou une commande genre "redim prevent (tablo(2) to ubound(tablo))". En vous remerciant !!!

Dim c As Range
Dim tablo()
Dim i As Integer, j As Integer
Dim temp As String
Dim present As Boolean

ReDim tablo(1 To 1)
tablo(1) = Cells(1, 1)
For Each c In Sheets("Feuil1").Range("A1:A" & Range("a65536").End(xlUp).Row)
present = False
For i = 1 To UBound(tablo)
If tablo(i) = c Then present = True
Next i
If Not present Then
ReDim Preserve tablo(1 To UBound(tablo) + 1)
tablo(UBound(tablo)) = c
End If
For i = 1 To UBound(tablo)
For j = 1 To UBound(tablo)
If tablo(i) < tablo(j) Then
temp = tablo(i)
tablo(i) = tablo(j)
tablo(j) = temp
End If
Next j
Next i
Next c

ListBox1.List = tablo
 

BOISGONTIER

XLDnaute Barbatruc
Repose en paix
Re : Ajouter un item à une list en s'assurant que l'item n'y figure pas déjà

Bonjour,

Pour obtenir une liste triée rapidement, utiliser Quick-sort et non pas Bubble-Sort

Pour supprimer un élément d'un comboBox, il y a RemoveItem position

Code:
Private Sub UserForm_Initialize()
  Set f = Sheets("BD")
  temp = Application.Transpose(Range(f.[a2], f.[a2].End(xlDown)).Value)
  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 Sub
 

Discussions similaires

Réponses
0
Affichages
154
Réponses
3
Affichages
525

Membres actuellement en ligne

Aucun membre en ligne actuellement.

Statistiques des forums

Discussions
312 248
Messages
2 086 593
Membres
103 248
dernier inscrit
Happycat