IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Alimenter plusieurs combobox (userforme) partir d'un onglet vba [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    ingénieur
    Inscrit en
    Janvier 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : ingénieur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Janvier 2015
    Messages : 3
    Par défaut Alimenter plusieurs combobox (userforme) partir d'un onglet vba
    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:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    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) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    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

  2. #2
    Membre Expert Avatar de Thautheme
    Homme Profil pro
    salarié
    Inscrit en
    Août 2014
    Messages
    1 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : salarié

    Informations forums :
    Inscription : Août 2014
    Messages : 1 373
    Par défaut
    Bonjour Seb, bonjour le forum,

    Ce genre d'aventure est courante quand l'erreur se situe dans l'initialisation de l'UserForm. Vu le numéro renvoyé, tu as dû mal orthographier le nom d'un onglet... Vérifie, à la lettre près, le ou les noms des onglets utilisés dans la procédure d'initialisation de l'UserForm03.
    ..

  3. #3
    Candidat au Club
    Homme Profil pro
    ingénieur
    Inscrit en
    Janvier 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : ingénieur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Janvier 2015
    Messages : 3
    Par défaut
    Bonjour Thauthème, Rebonjour le forum,

    Merci pour ta réponse.

    J'ai bien vérifié et le nom de l'onglet que j'utilise pour alimenter mes combobox est bien orthographié.

    Je pense que le problème vient plutôt du fait de réutiliser le même type de procédure à la suite, comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    Private Sub UserForm_Initialize()
     
    Dim sd As Object 'déclare la variable sd
    Dim str As Range 'déclare la variable sector (Plage)
    Dim cel As Range 'déclare la variable cel (Cellule)
    Dim tbl As Variant 'déclare la variable tbl1 (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)
     
    Dim sd2 As Object 'déclare la variable sd
    Dim str2 As Range 'déclare la variable sector (Plage)
    Dim cel2 As Range 'déclare la variable cel (Cellule)
    Dim tbl2 As Variant 'déclare la variable tbl1 (Tableau)
    Dim k As Integer 'déclare la variable i (incrément)
    Dim l As Integer 'déclare la variable j (incrément)
    Dim temp2 As Variant 'déclare la variable temp (valeur temporaire)
     
    'Alimentation combobox1
     
    Set sd = CreateObject("Scripting.Dictionary") 
     
        With Sheets("Entities")
            Set str = .Range(Range("C2"), Range("C65536").End(xlUp))  'La colonne C de mon onglet "Entities" alimente ma combobox1
        End With
     
            For Each cel In str
                sd(cel.Value) = ""     
            Next cel
            tbl = sd.keys           
     
    '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 
     
     
     
    'Alimentation deuxième combobox
     
    Set sd2 = CreateObject("Scripting.Dictionary") 
     
        With Sheets("Entities")
            Set str2 = .Range(Range("E2"), Range("E65536").End(xlUp))  'La colonne D de mon onglet "Entities" alimente ma combobox2
        End With
     
            For Each cel2 In str2
                sd2(cel2.Value) = ""     
            Next cel2
            tbl2 = sd2.keys          
     
    'tri alphabétique
     
    For k = 0 To UBound(tbl2)            
        For l = 0 To UBound(tbl2)        
            If tbl(k) < tbl(l) Then    
                temp2 = tbl(k)          
                tbl(k) = tbl(l)         
                tbl(l) = temp2         
            End If                    
        Next l                        
    Next k                          
     
    Me.ComboBox2.List = tbl2 
     
    End Sub

    Existe-t-il une autre manière de faire afin d'alimenter (sans doublons et avec classement par ordre alphabétique) plusieurs combobox à partir d'un même onglet, mais avec des colonnes différentes ?

  4. #4
    Membre Expert Avatar de Thautheme
    Homme Profil pro
    salarié
    Inscrit en
    Août 2014
    Messages
    1 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : salarié

    Informations forums :
    Inscription : Août 2014
    Messages : 1 373
    Par défaut
    Bonjour Seb, bonjour le forum,

    Ta méthode est correcte toutefois il y a des anomalies :
    • Ligne 24 et ligne 53 de ton code, il manque le point (.) devant les Range à l'intérieur de la parenthèse :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set str = .Range(.Range("C2"), .Range("C65536").End(xlUp))
    • Lignes 63 à 68, remplace tbl par tbl2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    For k = 0 To UBound(tbl2)
        For l = 0 To UBound(tbl2)
            If tbl2(k) < tbl2(l) Then
                temp2 = tbl2(k)
                tbl2(k) = tbl2(l)
                tbl2(l) = temp2
            End If
        Next l
    Next k
    Ton code très légèrement optimisé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    Private Sub UserForm_Initialize()
    Dim O As Worksheet 'déclare la varioable o (Onglet)
    Dim DL As Integer 'déclare la variable DL (Dernière Ligne)
    Dim TC As Variant 'déclare la variabe TC (Tableau de Cellules)
    Dim D1 As Object 'déclare la variable D1
    Dim TB1 As Variant 'déclare la variable TB1 (Tableau)
    Dim D2 As Object 'déclare la variable D2
    Dim TB2 As Variant 'déclare la variable TB2 (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 O = Sheets("Entities") 'définit l''onglet O
    DL = O.Cells(Application.Rows.Count, 3).End(xlUp).Row 'définit la dernière ligne éditée DL de la colonne 4 (=D) de l'onglet O
    TC = O.Range("C1:D" & DL) 'définit le tableau de cellules TC
    For I = 2 To UBound(TC, 1) 'boucle sur toutes les ligne du tableau TC (en partant de la seconde)
        D1(TC(I, 1)) = "" 'alimente le dictionnaire D1
        D2(TC(I, 2)) = "" 'alimente le dictionnaire D2
    Next I 'prochaine ligne de la boucle
    TB1 = D1.keys
    TB2 = D2.keys
    'tri alphabétique
    For I = 0 To UBound(TB1)
        For J = 0 To UBound(TB1)
        If TB1(I) < TB1(J) Then
            TEMP = TB1(I)
            TB1(I) = TB1(J)
            TB1(J) = TEMP
        End If
        Next J
    Next I
    Me.ComboBox1.List = TB1
    'tri alphabétique
    For I = 0 To UBound(TB2)
        For J = 0 To UBound(TB2)
        If TB2(I) < TB2(J) Then
            TEMP = TB2(I)
            TB2(I) = TB2(J)
            TB2(J) = TEMP
        End If
        Next J
    Next I
    Me.ComboBox2.List = TB2
    End Sub

  5. #5
    Candidat au Club
    Homme Profil pro
    ingénieur
    Inscrit en
    Janvier 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : ingénieur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Janvier 2015
    Messages : 3
    Par défaut
    Super ! Cela fonctionne.

    Merci beaucoup ThauThème pour ton aide.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2007] Alimenter une combobox a partir feuille excel
    Par debutant vba dans le forum Excel
    Réponses: 0
    Dernier message: 11/02/2013, 21h07
  2. [XL-2007] Alimentation de la ComboBox d'un UserForm à partir d'une plage de donnée
    Par Loukassit0 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 28/02/2012, 19h22
  3. Réponses: 3
    Dernier message: 16/09/2008, 18h08
  4. affichage listebox multiple colonne à partir de plusieurs combobox
    Par oscar.cesar dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 02/04/2008, 10h51
  5. [Talend OPen Studio] Alimenter plusieurs champs à partir d'un seul
    Par kaliadon dans le forum Développement de jobs
    Réponses: 3
    Dernier message: 25/10/2007, 12h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo