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 :

remplir un combobox en fonction d'un autre


Sujet :

Macros et VBA Excel

  1. #1
    Membre régulier
    Inscrit en
    Avril 2006
    Messages
    175
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 175
    Points : 91
    Points
    91
    Par défaut remplir un combobox en fonction d'un autre
    Bonjour a tous,

    Je voudrais remplir un combobox à partir d'une plage mais sans les valeurs d'un autre combobox.

    J'ai essayé d'utiliser pour cela la méthode RemoveItem, je rempli mon premier combobox normalement et lorsque je rempli le second à partir d'une autre plage je rajoute un RemoveItem sur les valeurs de mon premier combobox. Normalement je devrais avoir ainsi dans mon premier combobox toutes les valeurs de ma plages qui ne sont pas dans mon deuxième combo.

    En pratique, ça ne marche pas et j'ai des valeurs de mon premier combo égale au deuxième.

    Merci pour votre aide

  2. #2
    Membre du Club
    Inscrit en
    Mai 2007
    Messages
    106
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 106
    Points : 64
    Points
    64
    Par défaut
    essay ça, et dis moi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub UserForm_initialize()
     iL = Worksheets("Feuil1").Cells(65535, 1).End(xlUp).Offset(1).Row   'recupère le nombre de lignes remplies sur la colonne A
     
     For i = 1 To (iL - 1)
        ComboBox1 = Worksheets("Feuil1").Range("A" & i)
        If ComboBox1.ListIndex = -1 Then
        ComboBox1.AddItem Worksheets("Feuil1").Range("A" & i)    'si l'élément n'est pas dans la liste du Combobox on l'y ajoute
        End If
     Next i
    End Sub

  3. #3
    Membre régulier
    Inscrit en
    Avril 2006
    Messages
    175
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 175
    Points : 91
    Points
    91
    Par défaut
    Merci skorpio pour ta réponse,

    désolé mais j'ai par erreur envoyé mon post trop tôt, je ne souhaite pas remplir un combo sans doublon, mais remplir un combo sans les valeurs d'un autre combo.
    Mais l'idée était bonne et j'ai essayé de l'adapter.
    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
        FenetreFMESUser.CmbEffetCalNT.Clear 'initialisation du combo
        i = 4
        For Each Cell2 In Plage2
                If FenetreFMESUser.CmbListeFonction.Value = "" And FL1.Range("A" & i) <> "" Then
                    FenetreFMESUser.CmbEffetCalNT = Cell2.Value
                    If FenetreFMESUser.CmbEffetCalT.ListIndex = -1 Then
                    FenetreFMESUser.CmbEffetCalNT.AddItem Cell2.Value
                    End If
                End If
    
                If FL1.Range("A" & i) = FenetreFMESUser.CmbListeFonction.Value And FenetreFMESUser.CmbListeFonction.Value <> "" Then
                    FenetreFMESUser.CmbEffetCalNT = Cell2.Value
                    If FenetreFMESUser.CmbEffetCalT.ListIndex = -1 Then
                    FenetreFMESUser.CmbEffetCalNT.AddItem Cell2.Value
                    End If
                End If
                i = i + 1
        Next
    malheureusement ca ne marche pas non plus je n'ai qu'une valeur qui s'affiche dans mon combo, et elle se trouve dans mon deuxième combo

  4. #4
    Expert éminent Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 756
    Points : 9 402
    Points
    9 402
    Par défaut
    je viens de tester ce code, ca fait ce que tu souhaites (je crois)

    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
     
    Dim il As Long
    Dim i As Integer
    Dim bolTrouve As Boolean
     
    il = 1
     
    ComboBox2.Clear
     
     
    Do While Feuil1.Range("A" & il).Value <> ""
        bolTrouve = True
     
        For i = 0 To ComboBox1.ListCount - 1
     
            ComboBox1.ListIndex = i
            If ComboBox1.Text = Feuil1.Range("A" & il).Value Then
                bolTrouve = False
            End If
     
        Next i
     
        If bolTrouve = True Then ComboBox2.AddItem Feuil1.Range("A" & il).Value
     
        il = il + 1
    Loop

  5. #5
    Membre régulier
    Inscrit en
    Avril 2006
    Messages
    175
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 175
    Points : 91
    Points
    91
    Par défaut
    Ca marche merci Jérôme j'y serais pas arrivé tout seul

    j'ai essayé de l'adapté pour qu'il m'affiche les valeurs correspondant à la fonction choisit par l'utilisateur, de sorte que lorsque je choisit une fonction dans la combo-fonction il remplir la combo1 sans les valeurs d'un autre combo2, pour lequel le nom de la fonction est égale.

    par exemple :

    fonction ______ plage-combo1 _______ plage-combo2
    A _____________ 1 _______________ 2
    B _____________ 2
    A _____________ 2

    si je choisis la fonction A mon combo1 doit avoir la valeurs 1 car 2 est dans mon combo2

    j'ai essayé ceci mais mon combo reste vide

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    If FL1.Range("A" & i) = FenetreFMESUser.CmbListeFonction.Value And FenetreFMESUser.CmbListeFonction.Value <> "" Then
                        bolTrouve = True
                        For i = 0 To ComboBox1.ListCount - 1
                            ComboBox1.ListIndex = i
                            If ComboBox1.Text = FL1.Range("C" & i).Value Then
                                bolTrouve = False
                            End If
                        Next i
                        If bolTrouve = True Then 
                           ComboBox2.AddItem FL1.Range("C" & i).Value
                        End If

  6. #6
    Expert éminent Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 756
    Points : 9 402
    Points
    9 402
    Par défaut
    tu ne boucles pas sur la liste de la feuille.
    tu as remplacé le do while par un if.

  7. #7
    Membre régulier
    Inscrit en
    Avril 2006
    Messages
    175
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 175
    Points : 91
    Points
    91
    Par défaut
    oups

  8. #8
    Membre régulier
    Inscrit en
    Avril 2006
    Messages
    175
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 175
    Points : 91
    Points
    91
    Par défaut
    En faite mon code boucle de la façon suivante, j'utilise un For Each au début du programme. Avec 2 pricipaux If a l'intérieur. Un si la valeur de la fonction n'est pas définie, et l'autre si on a défini une valeur. La partie If FenetreFMESUser.CmbListeFonction.Value = "" marche, (si la fonction n'est pas défini), mais pour la suivante (If FL1.Range("A" & i) = FenetreFMESUser.CmbListeFonction.Value) lorsque je choisi une fonction mon combo2 reste vide.


    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
    Set Plage2 = FL1.Range("C4:C" & FL1.UsedRange.Rows.Count) 'selection de la plage 
     
    i = 4
        For Each Cell2 In Plage2      'On parcourt la liste effets par valeur
                FenetreFMESUser.CmbEffetCalNT.Clear
               If FenetreFMESUser.CmbListeFonction.Value = "" And FL1.Range("A" & i) <> "" Then 'Si la fonction n'est pas précisée on affiche tous les effets
                    il = 4
                    Do While FL1.Range("C" & il).Value <> ""
                        bolTrouve = True
                        For i = 0 To ComboBox1.ListCount - 1
                            ComboBox1.ListIndex = i
                            If ComboBox1.Text = FL1.Range("C" & il).Value Then
                                bolTrouve = False
                            End If
                        Next i
                        If bolTrouve = True Then ComboBox2.AddItem FL1.Range("C" & il).Value
                        il = il + 1
                    Loop
                End If         'ce If fonctionne mais pas le suivant.
     
                If FL1.Range("A" & i) = FenetreFMESUser.CmbListeFonction.Value And FenetreFMESUser.CmbListeFonction.Value <> "" Then 'Si la fonction est égale à la valeur de feuille.
                         bolTrouve = True
                        For k = 0 To ComboBox1.ListCount - 1
                            ComboBox1.ListIndex = k
                            If ComboBox1.Text = FL1.Range("C" & i).Value Then 'si l'index existe déja dans la combo1 alors on ne la renseigne pas dans la combo2
                                bolTrouve = False
                            End If
                        Next k
                        If bolTrouve = True Then ComboBox2.AddItem FL1.Range("C" & i).Value
                End If
            i = i + 1
        Next
    Mon code est peut être faux???



    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
    Set Plage2 = FL1.Range("C4:C" & FL1.UsedRange.Rows.Count) 'selection de la plage 
     
    i = 4
        For Each Cell2 In Plage2 
    .
    .
    .
    If FL1.Range("A" & i) = FenetreFMESUser.CmbListeFonction.Value And FenetreFMESUser.CmbListeFonction.Value <> "" Then 'Si la fonction est égale à la valeur de feuille.
                         bolTrouve = True
                        For k = 0 To ComboBox1.ListCount - 1
                            ComboBox1.ListIndex = k
                            If ComboBox1.Text = FL1.Range("C" & i).Value Then 'si l'index existe déja dans la combo1 alors on ne la renseigne pas dans la combo2
                                bolTrouve = False
                            End If
                        Next k
                        If bolTrouve = True Then ComboBox2.AddItem FL1.Range("C" & i).Value
                End If
            i = i + 1
        Next

  9. #9
    Expert éminent Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 756
    Points : 9 402
    Points
    9 402
    Par défaut
    tu utilises le i dans 2 boucles imbriquées
    il te faut en remplacer 1 par un autre nom de variable

  10. #10
    Membre régulier
    Inscrit en
    Avril 2006
    Messages
    175
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 175
    Points : 91
    Points
    91
    Par défaut
    Je pensais que si dans le code la condition If n'était pas vrai le code de la boucle if ne s'exécutait pas ? apparament si .

    J'ai intégré un nouvelle variable "a" sur le modèle de "i" mais j'ai toujours ma combo vide lorsque je sélectionne une fonction différente de l'ensemble vide.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
        If FL1.Range("A" & a) = FenetreFMESUser.CmbListeFonction.Value And FenetreFMESUser.CmbListeFonction.Value <> "" Then
                         bolTrouve = True
                        For k = 0 To FenetreFMESUser.CmbEffetCalT.ListCount - 1
                            FenetreFMESUser.CmbEffetCalT.ListIndex = k
                            If FenetreFMESUser.CmbEffetCalT.Text = FL1.Range("C" & a).Value Then
                                bolTrouve = False
                            End If
                        Next k
                        If bolTrouve = True Then FenetreFMESUser.CmbEffetCalNT.AddItem FL1.Range("C" & a).Value
                End If
            i = i + 1
            a = a + 1
        Next

  11. #11
    Expert éminent Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 756
    Points : 9 402
    Points
    9 402
    Par défaut
    je parlais de ce i la qui fallait changer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
                      For i = 0 To ComboBox1.ListCount - 1
                            ComboBox1.ListIndex = i
                            If ComboBox1.Text = FL1.Range("C" & il).Value Then
                                bolTrouve = False
                            End If
                        Next i

  12. #12
    Membre régulier
    Inscrit en
    Avril 2006
    Messages
    175
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 175
    Points : 91
    Points
    91
    Par défaut
    Ca marche
    génial,

    le coupable c'était le ComboBox2.Clear juste sous le For Each Cell2 In Plage2, qui me supprimait les valeurs du ComboBox2 après le passage à la cellule suivante. Mais alors j'ai pas compris pourquoi dans le cas ou la combo-fonction avait une valeur nulle ça marchait?

    Un grand merci à toi Jérôme pour ton aide précieuse, et ton temps passé à m'expliquer les mystères du vba.
    encore merci
    bonne fin de journée

    Alex

    voici le code pour remplir une combobox (ComboBox2) en fonction de la valeur d'une deuxième (CmbListeFonction) sans les valeur identique à une troisième (ComboBox1)
    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
    i = 4
        ComboBox2.Clear ' c'était lui
                For Each Cell2 In Plage2      'On parcourt la liste des effets
     
                If FenetreFMESUser.CmbListeFonction.Value = "" And FL1.Range("A" & i) <> "" Then 'Si la foncction n'est pas précisée on affiche tous les effets
                    il = 4
                    Do While FL1.Range("C" & il).Value <> ""
                        bolTrouve = True
                        For i = 0 To ComboBox1.ListCount - 1
                            ComboBox1.ListIndex = i
                            If ComboBox1.Text = FL1.Range("C" & il).Value Then
                                bolTrouve = False
                            End If
                        Next i
                        If bolTrouve = True Then ComboBox2.AddItem FL1.Range("C" & il).Value
                        il = il + 1
                    Loop
                End If
     
                If FL1.Range("A" & i) = FenetreFMESUser.CmbListeFonction.Value And FenetreFMESUser.CmbListeFonction.Value <> "" Then 
                         bolTrouve = True
                        For k = 0 To ComboBox1.ListCount - 1
                            ComboBox1.ListIndex = k
                            If ComboBox1.Text = FL1.Range("C" & i).Value Then
                                bolTrouve = False
                            End If
                        Next k
                        If bolTrouve = True Then ComboBox2.AddItem FL1.Range("C" & i).Value
                End If
            i = i + 1
        Next

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

Discussions similaires

  1. Remplir une combobox en fonction d'une autre et d'une textbox
    Par celthi dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 19/12/2014, 18h45
  2. remplir une combobox en fonction d'un autre
    Par mima_mine dans le forum Struts 1
    Réponses: 7
    Dernier message: 18/09/2008, 17h57
  3. Remplir un champ en fonction d'un autre
    Par YAHBM dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 08/03/2007, 16h33
  4. [VBA] Remplir un champ en fonction d'un autre champ
    Par Amanck dans le forum Access
    Réponses: 6
    Dernier message: 18/05/2006, 11h12
  5. Remplir un combobox en fonction d'un autre
    Par emkka dans le forum Composants VCL
    Réponses: 10
    Dernier message: 30/04/2006, 20h17

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