Combobox qui ne se remplit pas

PierreJeanPierre

XLDnaute Nouveau
Bonsoir,

Je fais mes débuts en VBA, j'arrive à progresser un peu grâce aux divers tutos que je trouve (notamment ici) mais là je sèche sur un truc, et mes recherches google ne m'ont pas débloqué.

J'ai une macro qui ouvre un premier userform me proposant de choisir entre deux années, 2010 et 2011. Une fois que c'est fait je valide avec un commandbutton, qui en profite pour désigner la feuille de données de l'année concernée comme étant la feuille active.

La macro emmène alors sur un second userform, qui contient cette fois-ci une combobox (mais ça aurait tout aussi bien pu être une liste classique, j'ai un peu pris au hasard) qui est supposée afficher les valeurs possibles d'une des colonnes de ma feuille active, idéalement sans doublon. J'ai essayé de faire au plus simple, mais quand l'userform apparaît la liste est désespérément vide.

J'ai en parallèle créé une seconde combobox (numérotée 2 du coup) qui va chercher exactement les mêmes données, sauf que j'ai indiqué la plage directement dans les paramètres de la box. Et là ça fonctionne... sauf qu'il y a des doublons, c'est pas trié, et pareil quand j'essaie de remettre de l'ordre avec un code adéquat (trouvé ici-même) dont je pense avoir compris le fonctionnement mais il ne se passe rien, la liste garde ses doublons.

Voilà la tête de mon userform:

Code:
Private Sub UserForm2_Initialize()

Me.ComboBox1.List = ActiveSheet.Range("C2:C8000").Value

' Note: j'ai essayé l'instruction précédente en utilisant le nom de la feuille (par exemple Worksheets("Liste 2010")) au lieu d'Activesheet mais le résultat est le même

' La suite est un copier/coller du code évoqué plus haut, en modifiant juste les paramètres nécessaires pour que ça colle

Dim sd As Object 'déclare la variable sd (Sans Doublons)
Dim pl As Range 'déclare la variable pl (Plage)
Dim cel As Range 'déclare la variable cel (Cellule)
Dim tbl As Variant 'déclare la variable tbl (Tableau)
Dim i As Integer 'déclare la variable i (incrément)
Dim j As Integer 'déclare la variable j (incrément)
Dim temp As Variant 'déclare la variable temp (valeur Temporaire)
 
Set sd = CreateObject("Scripting.Dictionary") 'définit la variable sd
With ActiveSheet 'prend en compte l'onglet "Liste 2010"
    Set pl = .Range("C2:C" & .Cells(Application.Rows.Count, 1).End(xlUp).Row) 'définit la plage pl
End With 'fin de la prise en compte de l'onglet "Liste 2010"
For Each cel In pl 'boucle sur toutes les cellules cel de la plage pl
    sd(cel.Value) = "" 'alimente la liste sans doublons
Next cel 'prochaine cellule de la boucle
tbl = sd.keys 'définit le tableau des valeurs sans doublons
'tri alphabétique
For i = 0 To UBound(tbl) 'boucle 1 de 0 au nombre de valeur du tableau
    For j = 0 To UBound(tbl) 'boucle 2 de 0 au nombre de valeur du tableau
        If tbl(i) < tbl(j) Then 'condition : si la valeur de la boucle 1 est invérieure à la valeur de la boucle 2
            temp = tbl(i) 'définit la valeur temporaire temp
            tbl(i) = tbl(j) 'la valeur de la boucle un devient la valeur de la boucle 2
            tbl(j) = temp 'la valeur de la boucle deux devient la valeur temporaire temp
        End If 'fin de la condition
    Next j 'prochaine valeur de la boucle 2
Next i 'prochaine valeur de la boucle 1
Me.ComboBox2.List = tbl 'alimente la ComboBox1 sans doublons et trié par ordre alphabétique

End Sub

Et donc voilà où j'en suis pour le moment, une ComboBox1 qui ne se remplit pas en dépit de la liste de valeurs que j'indique, et une ComboBox2 qui ne se trie pas malgré l'utilisation d'un code qui avait semble-t-il très bien fonctionné pour l'utilisateur à qui il avait été donné... J'imagine que j'ai juste fait une grossière erreur de débutant mais je n'arrive pas à comprendre où elle peut être, merci par avance pour vos conseils.
 

Pierrot93

XLDnaute Barbatruc
Re : Combobox qui ne se remplit pas

Bonjour,

petite remarque au passage, modifie ceci :
Code:
Private Sub UserForm2_Initialize()
par cela :
Code:
Private Sub UserForm_Initialize()

ce n'est point le nom de l'usf qu'il faut mettre... mais l'objet auquel se rapporte la classe...

bonne journée
@+
 

PierreJeanPierre

XLDnaute Nouveau
Re : Combobox qui ne se remplit pas

Je profite du sujet pour placer une autre question, toujours sur les comboboxes. J'en ai actuellement 3, qui listent respectivement la catégorie, la sous-catégorie, et le libellé. Sachant qu'à chaque libellé correspond une unique sous-catégorie, qui elle-même correspond à une unique catégorie.

Ce que je voudrais du coup, c'est qu'en fonction de la catégorie que je choisis ça filtre la seconde combobox en n'affichant que les sous-catégories compatibles (avec possibilité de laisser vide), puis si une sous-catégorie est indiquée que la troisième combobox n'affiche que les libellés relevant de cette sous-catégorie.

Voilà mon code à l'heure actuelle, j'ai mis le tri/nettoyage de doublons dans une fonction vu que ça sert 3 fois.

Code:
Private Function tri(cible, plage, plage2)

cible.List = ActiveSheet.Range(plage).Value

Dim sd As Object 'déclare la variable sd (Sans Doublons)
Dim pl As Range 'déclare la variable pl (Plage)
Dim cel As Range 'déclare la variable cel (Cellule)
Dim tbl As Variant 'déclare la variable tbl (Tableau)
Dim i As Integer 'déclare la variable i (incrément)
Dim j As Integer 'déclare la variable j (incrément)
Dim temp As Variant 'déclare la variable temp (valeur Temporaire)
 
Set sd = CreateObject("Scripting.Dictionary") 'définit la variable sd
With ActiveSheet 'prend en compte l'onglet "Liste 2010"
    Set pl = .Range(plage2 & .Cells(Application.Rows.Count, 1).End(xlUp).Row) 'définit la plage pl
End With 'fin de la prise en compte de l'onglet "Liste 2010"
For Each cel In pl 'boucle sur toutes les cellules cel de la plage pl
    sd(cel.Value) = "" 'alimente la liste sans doublons
Next cel 'prochaine cellule de la boucle
tbl = sd.keys 'définit le tableau des valeurs sans doublons
'tri alphabétique
For i = 0 To UBound(tbl) 'boucle 1 de 0 au nombre de valeur du tableau
    For j = 0 To UBound(tbl) 'boucle 2 de 0 au nombre de valeur du tableau
        If tbl(i) < tbl(j) Then 'condition : si la valeur de la boucle 1 est invérieure à la valeur de la boucle 2
            temp = tbl(i) 'définit la valeur temporaire temp
            tbl(i) = tbl(j) 'la valeur de la boucle un devient la valeur de la boucle 2
            tbl(j) = temp 'la valeur de la boucle deux devient la valeur temporaire temp
        End If 'fin de la condition
    Next j 'prochaine valeur de la boucle 2
Next i 'prochaine valeur de la boucle 1
cible.List = tbl 'alimente la ComboBox1 sans doublons et trié par ordre alphabétique

End Function

Private Sub UserForm_Initialize()

Call tri(Me.ComboBox1, "H2:H10000", "H2:H")
Call tri(Me.ComboBox2, "I2:I10000", "I2:I")
Call tri(Me.ComboBox3, "G2:G10000", "G2:G")


End Sub

Que dois-je ajouter pour obtenir le filtrage voulu ? J'imagine que ça ne peut se faire qu'en dehors de la fonction, j'espère que ce n'était pas une erreur d'automatiser le filtrage de cette manière...

Merci par avance
 

Discussions similaires

Réponses
7
Affichages
526

Statistiques des forums

Discussions
314 485
Messages
2 110 101
Membres
110 663
dernier inscrit
ToussaintBug