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 :

Probleme ComboBox en cascade


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 36
    Par défaut Probleme ComboBox en cascade
    Bonsoir à tous

    Je n'ai pas l'habitude de travailler sur excel ! j'ai donc beaucoup de difficultées et je ne connais pas tous les termes, je vous pris d'accepter mes excuses. J'ai parcouru le forum, les tutos, pour réaliser ce travail mais je bloque dur!

    Dans un UserForm j'ai 4 ComboBox en cascade, j'utilise le code que j'ai trouvé à l'aide du forum
    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
    Option Explicit
     
    Dim Ws As Worksheet
    Dim NbLignes As Integer
     
     
    Private Sub UserForm_Initialize()
        'Définit la feuille contenant les données
        Set Ws = Worksheets("Base")
        'Définit le nombre de lignes dans la colonne A
        NbLignes = Ws.Range("A65536").End(xlUp).Row
     
        'Remplissage du ComboBox1
        Alim_Combo 1
     
    End Sub
     
     
    Private Sub ComboBox1_Change()
        'Remplissage Combo2
        Alim_Combo 2, ComboBox1.Value
    End Sub
     
     
    Private Sub ComboBox2_Change()
        'Remplissage Combo3
        Alim_Combo 3, ComboBox2.Value
    End Sub
     
     
    Private Sub ComboBox3_Change()
        'Remplissage Combo4
        Alim_Combo 4, ComboBox3.Value
    End Sub
     
     
     
    'Procédure pour alimenter les ComboBox
    Private Sub Alim_Combo(CbxIndex As Integer, Optional Cible As Variant)
        Dim j As Integer
        Dim Obj As Control
     
        'Définit le ComboBox à remplir
        Set Obj = Me.Controls("ComboBox" & CbxIndex)
        'Supprime les anciennes données
        Obj.Clear
     
        'alimente le Combobox initial (Combobox1)
        If CbxIndex = 1 Then
            'Boucle sur les lignes de la colonne A (à partir de la 2eme ligne)
            For j = 2 To NbLignes
                Obj = Ws.Range("A" & j)
                'Remplit le ComboBox sans doublons
                If Obj.ListIndex = -1 Then Obj.AddItem Ws.Range("A" & j)
            Next j
        Else
            'Alimentation conditionnelle des autres Combobox en fonction de
            'ce qui est sélectionnée dans le contrôle précédent:
            '(La sélection du ComboBox1 définit le contenu du ComboBox2,
            'La sélection du ComboBox2 définit le contenu du ComboBox3 ?etc...)
            For j = 2 To NbLignes
                If Ws.Range("A" & j).Offset(0, CbxIndex - 2) = Cible Then
                    Obj = Ws.Range("A" & j).Offset(0, CbxIndex - 1)
                    If Obj.ListIndex = -1 Then Obj.AddItem Ws.Range("A" & j).Offset(0, CbxIndex - 1)
                End If
            Next j
       End If
     
       'Enlève la sélection dans le ComboBox
       Obj.ListIndex = -1
    End Sub
    Le soucis que j'ai c'est que tel quel ce code ne filtre pas. Je m'explique lorsque je suis sur le ComboBox 3 il m'affiche toute la colone C de l'Onglet "base" avec le critère du ComboBox2 sans prendre en compte le critère du ComboBox1.
    Je ne sais vraiment pas comment faire pour que le ComboBox3 affiche le résultat avec les critères du ComboBox1 et du ComboBox2 !

    Merci de m'aider si c'est possible!!

  2. #2
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Bonsoir,
    Logique du fait que la Combo N prend comme critère que les valeur de la colonne où les données sont égales à Combo N-1

    ci joint proposition (certes longue) mais explicative (à l'aide de 3 combo)
    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
    Option Explicit
    Dim Ws As Worksheet
    Dim NbLignes As Integer
     
     
    Private Sub UserForm_Initialize()
    Dim j As Long
    Dim kol As New Collection
     
    Set Ws = Worksheets("Feuil2")
    NbLignes = Ws.Cells(Ws.Rows.Count, 1).End(xlUp).Row
    For j = 2 To NbLignes
        On Error Resume Next
        kol.Add Ws.Range("A" & j).Value, Range("A" & j).Value
    Next j
     
    For j = 1 To kol.Count
        Me.ComboBox1.AddItem kol(j)
    Next j
     
    End Sub
     
     
    Private Sub ComboBox1_Change()
    Dim j As Long
    Dim kol As New Collection
     
    For j = 2 To NbLignes
        On Error Resume Next
        If Ws.Range("A" & j).Value = Me.ComboBox1.Value Then kol.Add Ws.Range("B" & j).Value, Range("B" & j).Value
    Next j
    Me.ComboBox2.Clear
    For j = 1 To kol.Count
        Me.ComboBox2.AddItem kol(j)
    Next j
    End Sub
     
     
    Private Sub ComboBox2_Change()
    Dim j As Long
    Dim kol As New Collection
     
    For j = 2 To NbLignes
        On Error Resume Next
        If Ws.Range("A" & j).Value = Me.ComboBox1.Value And Ws.Range("B" & j).Value = Me.ComboBox2.Value Then kol.Add Ws.Range("C" & j).Value, Range("C" & j).Value
    Next j
    Me.ComboBox3.Clear
    For j = 1 To kol.Count
        Me.ComboBox3.AddItem kol(j)
    Next j
    End Sub

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 36
    Par défaut
    Merci d'avoir répondu aussi vite

    J'ai essayé, le comboBox 1 ne ce charge pas avec ce code

  4. #4
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Bonjour,
    As tu adapté cette ligne de code par le nom de ta feuille de données?, j'ai mis "Feuil2", chez toi "Base"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set Ws = Worksheets("Feuil2")

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 36
    Par défaut
    Bonjour

    Oui je l'ai renomé mais rien!

  6. #6
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Bonjour
    Comme ça fonctionne chez moi sur un exemple et comme tu affirme que chez toi non. Sans aucun autre détail sur la disposition des données et/ou ton code en entier, on ne peux pas deviner

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 36
    Par défaut
    Bonsoir
    1er essais
    J'ai copier le code en lieu et place de celui que j'avais j'ai renomé la Feuil2 par Base là le combobox1 ne charge pas ?
    2ème essais:
    J'ai ouvert un nouveau classeur Excel Feuil1 j'ai mis un Bouton avec la formule UserForm1.show quand click. Feuil2 j'ai copier les 4 premières colones de ma base. J'ai créer un userforme avec 3 combobox auquel j'ai affecté ton code et là le combobox1 ne charge pas ?
    Pour les données c'est la Feuil2 de mon classeur qui les contients il y à 110 lignes sur 20 colones la cascade que je souhaite est sur les 4 premières colone (A,B,C,D). Le Userform est initialisé par un bouton alors que le tableau est sur la Feuil1. Ce userform doit me permetre de renseigner le tableau de la Feuil1.
    Pour faire simple sur la cascade:
    Colone A des nombres expl (10; 20; 30)
    Colone B des villes
    Colone C des Objets
    Dans les villes il y à des objets (x quantité); Les villes ont un nombre (Valeur de taille: 10 petite 20 moyen 30 grosse), la même ville peut etre dans 10; 20; 30 ou que dans 20 par exemple. Je souhaite que le dernier combobox me donne les objets de la ville qui ne sont que dans 10 si j'ai selectioné 10 dans le premier combobox. Le code que j'ai envoyé hier affiche les villes qui correspondent à 10 par exemple mais me donnes les objets de cette ville qui soit dans 10; 20; ou 30
    J'espere avoir été explicite j'ai peux etre fais des erreur dans mes manip? (10;20;30 petit, moyens,grosse n'est que pour l'exemple!)
    Merci d'avoir pris le temps de me lire !

  8. #8
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Bonsoir, tes données sont des nombres
    essayes 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
    Dim Ws As Worksheet
    Dim NbLignes As Integer
     
     
    Private Sub UserForm_Initialize()
    Dim j As Long
    Dim kol As New Collection
     
    Set Ws = Worksheets("Feuil1")
    NbLignes = Ws.Cells(Ws.Rows.Count, 1).End(xlUp).Row
    For j = 2 To NbLignes
        On Error Resume Next
        kol.Add Ws.Range("A" & j).Value, CStr(Range("A" & j).Value)
    Next j
     
    For j = 1 To kol.Count
        Me.ComboBox1.AddItem kol(j)
    Next j
     
    End Sub
     
     
    Private Sub ComboBox1_Change()
    Dim j As Long
    Dim kol As New Collection
     
    For j = 2 To NbLignes
        On Error Resume Next
        If CStr(Ws.Range("A" & j).Value) = Me.ComboBox1.Value Then kol.Add Ws.Range("B" & j).Value, CStr(Range("B" & j).Value)
    Next j
    Me.ComboBox2.Clear
    For j = 1 To kol.Count
        Me.ComboBox2.AddItem kol(j)
    Next j
    End Sub
     
     
    Private Sub ComboBox2_Change()
    Dim j As Long
    Dim kol As New Collection
     
    For j = 2 To NbLignes
        On Error Resume Next
        If CStr(Ws.Range("A" & j).Value) = Me.ComboBox1.Value And CStr(Ws.Range("B" & j).Value) = Me.ComboBox2.Value Then kol.Add Ws.Range("C" & j).Value, CStr(Range("C" & j).Value)
    Next j
    Me.ComboBox3.Clear
    For j = 1 To kol.Count
        Me.ComboBox3.AddItem kol(j)
    Next j
    End Sub

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 36
    Par défaut
    Merci d'essayer

    malheureusement même probleme!

    Non mes données ne sont pas des nombres ce n'était que pour l'exemple!
    Colone A = une tension en volt (exemple 60 v)
    Colone B = nom de ville comme Pau; Paris; Madrid
    Colone C = une chaine alphanumérique comme T60MAD (qui est en fait une codification de repere pour archiver mes documents).

  10. #10
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    A toi d'essayer correctement
    j'ai essayé avant de poster
    ci joint exemple

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 36
    Par défaut
    Bonsoir

    Effectivement ça marche! je vais chercher !!

    Merci

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 36
    Par défaut
    Bonsoir

    Je commence à cerner le problème. J'ai augmenté la cascade de combobox! ça ne marche tel quel que si:
    Les données sont dans la colone A (j'ai compris qu'il fallais changer la valeur aprés row.count).
    Que le Bouton est sur la même feuil que les données (là je seche!). Dans mon projet je préfèrerais avoir le bouton dans une autre feuil.
    Quand je copie le bouton sur une autre feuil le UserForm ne s'ouvre pas. Sur ton exemple j'ai copier le code de la feuil1 dans la feuil2 et la le UserForm s'ouvre mais le combobox1 n'à chargé que la cellule A2
    J'ai remarqué que les codes sont sur les feuil dans le projet VBA alors que les miens sont dans un module sur VBA pour les boutons, que toute commence par Option Explicit, pas les miennes ?

    Merci encore

  13. #13
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Bonsoir, Là il y a une grande incompréhension.
    les codes cités ci-haut sont à mettre dans le code de l'userform (où il y à les combo en cascade)
    la feuille où les données seront reportées est instancié dans le Initialize de l'userform (une fois pour toute)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set Ws = Worksheets("Feuil1")
    ; à la place de Feuil1, tu consens que tu dois mettre le nom de ta feuille de données.
    Pour afficher cet userform de n'importe où, tu mets

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 36
    Par défaut
    Oui oui ! je suis d'accord
    je vois que je suis incompréensible
    Dans ton exemple si tu coupes le bouton pour le coler dans la feuil2 tu verras que le UserForm ne fonctionne plus! nous somme d'accord, ou je fais une mauvaise manip ? Il faut donc reporter le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Option Explicit
     
    Private Sub CommandButton1_Click()
    UserForm1.Show
    End Sub
    sur la feuil 2 là le userform s'ouvre par contre combobox1 n'a que la valeur de la cellule A2 de la feuil1 !

  15. #15
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Tu n'as qu'à créer le CommandButton là où tu veux et de lui attribuer la macro d'ouverture de l'userform!!
    Tu as tout le travail fait!
    à toi de comprendre, de se documenter sur des choses simples et d'avancer.
    Par contre, il fallait réajuster pour indiquer de quelle feuille s'agit il
    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
    Dim Ws As Worksheet
    Dim NbLignes As Integer
     
    Private Sub UserForm_Initialize()
    Dim j As Long
    Dim kol As New Collection
     
    Set Ws = Worksheets("Feuil1")
    With Ws
    NbLignes = .Cells(.Rows.Count, 1).End(xlUp).Row
    For j = 2 To NbLignes
        On Error Resume Next
        kol.Add .Range("A" & j).Value, CStr(.Range("A" & j).Value)
    Next j
    end with 
    For j = 1 To kol.Count
        Me.ComboBox1.AddItem kol(j)
    Next j
    End Sub
     
    Private Sub ComboBox1_Change()
    Dim j As Long
    Dim kol As New Collection
    With Ws 
    For j = 2 To NbLignes
        On Error Resume Next
        If CStr(.Range("A" & j).Value) = Me.ComboBox1.Value Then kol.Add .Range("B" & j).Value, CStr(.Range("B" & j).Value)
    Next j
    End With
    Me.ComboBox2.Clear
    For j = 1 To kol.Count
        Me.ComboBox2.AddItem kol(j)
    Next j
    End Sub
     
    Private Sub ComboBox2_Change()
    Dim j As Long
    Dim kol As New Collection
    With Ws 
    For j = 2 To NbLignes
        On Error Resume Next
        If CStr(.Range("A" & j).Value) = Me.ComboBox1.Value And CStr(.Range("B" & j).Value) = Me.ComboBox2.Value Then kol.Add .Range("C" & j).Value, CStr(.Range("C" & j).Value)
    Next j
    End With
    Me.ComboBox3.Clear
    For j = 1 To kol.Count
        Me.ComboBox3.AddItem kol(j)
    Next j
    End Sub

  16. #16
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Par défaut
    Bonjour,
    Je ne sais pas si ça peu t'aider ??
    Voir le classeur sur ce poste
    A+

  17. #17
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 36
    Par défaut
    Bonjour

    Tout d'abord ça y est il m'à fallut chercher un peu! j'ai bien avancé sur mon projet. Il me reste un petit problème ou je patauge ! Il fera l'objet d'un autre post si je ne trouve pas!

    Je tiens à remercier mercatog ainsi que tous ceux qui répondent car j'avance bien souvent avec la réponses des autres posts

    merci encore à tous !

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

Discussions similaires

  1. ptit probleme combobox sous vba/excel
    Par bandito dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 19/10/2006, 10h34
  2. [VBA-E] ComboBox en cascade avec correspondance dans matrice
    Par ViperSpy dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 21/06/2006, 18h01
  3. [C++.Net] Probleme combobox & datagrid
    Par raboin dans le forum VC++ .NET
    Réponses: 16
    Dernier message: 12/04/2006, 17h33
  4. [MFC]Probleme ComboBox
    Par Raton dans le forum MFC
    Réponses: 2
    Dernier message: 27/03/2006, 11h36
  5. Probleme combobox et ini
    Par Techsan dans le forum Langage
    Réponses: 3
    Dernier message: 24/01/2003, 20h16

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