Alimenter plusieurs combobox (userforme) partir d'un onglet vba

Résolu/Fermé
seb3386 Messages postés 3 Date d'inscription mardi 20 janvier 2015 Statut Membre Dernière intervention 20 janvier 2015 - 20 janv. 2015 à 13:41
seb3386 Messages postés 3 Date d'inscription mardi 20 janvier 2015 Statut Membre Dernière intervention 20 janvier 2015 - 20 janv. 2015 à 17:44
Bonjour à tous,

Je travaille à la réalisation d'un formulaire sur excel en utilisant des userforms (passage d'un Userform à un autre avec des boutons "Next" et "Back").

Sur un des userforms (Userform03), je souhaiterais insérer des comboboxs (au nombre de 9), qui s'alimentent à partir de données dans un onglet de mon fichier excel, à la fois :
- en supprimant les doublons
- et en présentant les données de la combobox par ordre alphabétique (car les données dans la feuille excel ne sont pas triées et ne doivent pas l'être).

Pour remplir ma Combobox1 sur mon Userform03, voici ce que j'ai fait:

Private Sub UserForm_Initialize()

Dim sd As Object
Dim str As Range
Dim cel As Range
Dim tbl As Variant
Dim i As Integer
Dim j As Integer
Dim temp As Variant

Set sd = CreateObject("Scripting.Dictionary")

With Sheets("Entities") 'feuille sur laquelle se trouvent mes données qui permettent d'alimenter ma combobox
Set str = .Range(Range("C2"), Range("C65536").End(xlUp)) 'définit la plage de données
End With

For Each cel In str
sd(cel.Value) = "" 'alimente la liste sans doublons
Next cel
tbl = sd.keys 'définit le tableau des valeurs sans doublons

'tri alphabétique

For i = 0 To UBound(tbl)
For j = 0 To UBound(tbl)
If tbl(i) < tbl(j) Then
temp = tbl(i)
tbl(i) = tbl(j)
tbl(j) = temp
End If
Next j
Next i

Me.ComboBox1.List = tbl

End Sub


Cela marche plutôt bien pour une seule combobox. Mais c'est dès que je cherche à remplir les autres Combobox que cela se complique.

J'ai essayé de dupliquer (autant de fois qu'il y a de combobox) la procédure en créant de nouvelles variables (dans le même sub) mais le passage du Userform02 au Userform03 ne marche pas. J'ai le message d'erreur suivant lorsque je tente de passer du Userform02 au Userform03 : "Erreur d'execution '9': l'indice n'appartient pas à la sélection".

Lorsque je clique sur débogage, c'est la ligne suivante ( présente dans le code du Userform2) qui est surlignée en jaune et à la source du bug (en gras et soulignée ci-dessous) :

Private Sub CommandButton1_Click()

'Passer au UserForm03
Unload Me
UserForm03.Show

End Sub


Auriez-vous une solution à mon problème, ou une autre alternative afin de remplir plusieurs combobox dans un userform ?

Merci beaucoup pour votre attention.

Sébastien

6 réponses

pilas31 Messages postés 1825 Date d'inscription vendredi 5 septembre 2008 Statut Contributeur Dernière intervention 24 avril 2020 643
Modifié par pilas31 le 20/01/2015 à 16:58
Bonjour,

Difficile de comprendre car cela devrait fonctionner.
Une question :
OK j'ai pas bien lu donc oui il y a du code et c'est bien la procédure initialize qui provoque cela donc Est-ce que le nom de la feuille "Entities" est bien orthographié ?

Les autres combos sont remplies avec des données se trouvant dans d'autres feuilles ?
Je pense qu'il y a un nom de feuille incorrect dans la macro initialize

Cordialement,
0
cs_Le Pivert Messages postés 7904 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 14 août 2024 729
20 janv. 2015 à 17:03
Bonjour,

Ton problème vient du fait que ton code est dans:

Private Sub UserForm_Initialize()

il faut le mettre dans:

Private Sub UserForm_Activate()

comme ceci

Private Sub UserForm_Activate()
Dim sd As Object
Dim str As Range
Dim cel As Range
Dim tbl As Variant
Dim i As Integer
Dim j As Integer
Dim temp As Variant
   
Set sd = CreateObject("Scripting.Dictionary")
    
    With Sheets("Entities") 'feuille sur laquelle se trouvent mes données qui permettent d'alimenter ma combobox
        Set str = .Range(Range("C2"), Range("C65536").End(xlUp)) 'définit la plage de données
    End With
        
        For Each cel In str
            sd(cel.Value) = ""      'alimente la liste sans doublons
        Next cel
        tbl = sd.keys           'définit le tableau des valeurs sans doublons
   
'tri alphabétique

For i = 0 To UBound(tbl)
    For j = 0 To UBound(tbl)
        If tbl(i) < tbl(j) Then
            temp = tbl(i)
            tbl(i) = tbl(j)
            tbl(j) = temp
        End If
    Next j
Next i

Me.ComboBox1.List = tbl
With Sheets("Entities") 'feuille sur laquelle se trouvent mes données qui permettent d'alimenter ma combobox
        Set str = .Range(Range("D2"), Range("C65536").End(xlUp)) 'définit la plage de données
    End With
        
        For Each cel In str
            sd(cel.Value) = ""      'alimente la liste sans doublons
        Next cel
        tbl = sd.keys           'définit le tableau des valeurs sans doublons
   
'tri alphabétique

For i = 0 To UBound(tbl)
    For j = 0 To UBound(tbl)
        If tbl(i) < tbl(j) Then
            temp = tbl(i)
            tbl(i) = tbl(j)
            tbl(j) = temp
        End If
    Next j
Next i

Me.ComboBox2.List = tbl
End Sub

0
cs_Le Pivert Messages postés 7904 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 14 août 2024 729
20 janv. 2015 à 17:32
mais le passage du Userform02 au Userform03 ne marche pas.

Utilise ceci:

Private Sub CommandButton1_Click()
lancementUSF
UserForm2.Hide
End Sub
'http://silkyroad.developpez.com/VBA/UserForm/
Sub lancementUSF()
    Dim sVariable As String
     sVariable = "UserForm1"
    VBA.UserForms.Add(sVariable).Show
End Sub


les noms des UserForm sont a adapter
0
seb3386 Messages postés 3 Date d'inscription mardi 20 janvier 2015 Statut Membre Dernière intervention 20 janvier 2015
20 janv. 2015 à 17:33
Bonjour Pilas, Bonjour cs_Le Pivert, Bonjour le forum,

Merci beaucoup pour vos réponses.

Merci Pilas:

Le nom de la feuille "Entities" est bien orthographié, j'ai bien vérifié.
Les autres combo sont censées être, pour une partie, alimentées par la même feuille, et pour une autre partie par une autre feuille excel.
J'ai bien vérifié les orthographes, mais cela ne vient pas de là.

Merci cs_Le Pivert:

Je viens de remplacer
Private Sub UserForm_Initialize() 
par
Private Sub UserForm_Activate() 



J'ai maintenant une autre erreur. Elle provient de la définition de la plage. La ligne surlignée est la ligne numéro 13 dans le message de cs_Le Pivert. Je vais essayer de chercher d'où cela provient, mais je ne vois pas bien...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Le Pivert Messages postés 7904 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 14 août 2024 729
20 janv. 2015 à 17:38
Cela doit provenir des saisies dans la colonne C.

J'ai fait un essai chez moi avec 5 saisies dans la colonne C à partir de C2 et cela fonctionne!
0
seb3386 Messages postés 3 Date d'inscription mardi 20 janvier 2015 Statut Membre Dernière intervention 20 janvier 2015
20 janv. 2015 à 17:44
L'erreur résiduelle provenait de ma définition de la plage. Il fallait que je rajoute les . devant les range.

Cela fonctionne maintenant !

Merci beaucoup pour votre aide.
0