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 :

ComboBox avec deux conditions [XL-2016]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Homme Profil pro
    Voilier
    Inscrit en
    Décembre 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Voilier
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2018
    Messages : 7
    Par défaut ComboBox avec deux conditions
    Bonjour,
    Je reviens vers vous car je sèche encore...

    J'utilise excel 365

    j'ai un tableau sur une feuille excel 'tissu' avec 5 colonnes. La 1ere est la famille, la 2eme est sous-famille, la 3eme est le nom du produit, la 4 est le prix et la 5 la largeur du produit

    Crosscut Dacron HSX 625 12,20 € 1,37
    Crosscut Dacron HSX 626 13,20 € 1,35
    Crosscut Dacron HSX 627 14,20 € 1,33
    Crosscut Dacron HSX 628 15,20 € 1,29
    Crosscut Dacron HSX 629 16,20 € 1,27
    Crosscut Polyester HPX 433 8,40 € 1,25
    Crosscut Polyester HPX 533 9,85 € 1,23
    Crosscut Polyester HPX 633 10,76 € 1,21
    Crosscut Polyester HPX 733 11,42 € 1,19
    Crosscut Polyester HPX 833 13,02 € 1,17
    Tri-radial CL CL 25 19,50 € 1,15
    Tri-radial CL CL 35 22,50 € 1,13
    Tri-radial CL CL 45 25,50 € 1,09
    Tri-radial DC DC 12 23,00 € 1,07
    Tri-radial DC DC 22 26,25 € 1,05
    Tri-radial DC DC 32 29,50 € 1,03
    Tri-radial Spi Nylon Nylite 0,75 8,12 € 0,99
    biradiale CZ CZ 15 18,40 € 0,97
    biradiale Monofilm MN45 12,00 € 0,93

    Comment faire pour afficher une liste dans une combobox avec deux conditions?

    Dans ma combobox3, une fois que j'ai choisi ma sous-famille, ça me récupère tous les produits qui correspondent à la sous-famille, alors que je souhaiterais tous les produits qui correspondent à la sous-famille ET à la famille (l'info du 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
    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
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
     
     
    Option Explicit
     
    ' *********************
    ' ** combo n°1 coupe **
    ' *********************
    Private Sub UserForm_Initialize()
     
     
    Dim Dico
    Dim Cel As Range
        Set Dico = CreateObject("Scripting.Dictionary")
        With Worksheets("tissu")
     
            For Each Cel In .Range("A2", .Range("A" & Rows.Count).End(xlUp))
                If Not Dico.Exists(Cel.Value) Then
                    Dico.Add Cel.Value, Cel.Value
                    Me.ComboBox1.AddItem Cel.Value
                End If
            Next Cel
        End With
     
     
    End Sub
     
    ' *****************************
    ' ** combo n°2 famille tissu **
    ' *****************************
    Private Sub ComboBox1_Change()
    Dim Dico
    Dim Cel As Range
     
        With Worksheets("tissu")
     
            For Each Cel In .Range("A2", .Range("A" & Rows.Count).End(xlUp))
     
                    If Cel.Value = Me.ComboBox1.Value Then
                    Me.ComboBox2 = Cel.Offset(, 1).Value
                   If ComboBox2.ListIndex = -1 Then ComboBox2.AddItem Cel.Offset(, 1).Value
                End If
            Next Cel
        End With
     
    End Sub
     
    ' *************************
    ' ** combo n°3 tissu **
    ' *************************
    Private Sub ComboBox2_Change()
     
    Dim Cel As Range
        With Worksheets("tissu")
            For Each Cel In .Range("B2", .Range("B" & Rows.Count).End(xlUp))
                If Cel.Value = Me.ComboBox2.Value Then
    '            If Cel.Value(-1, 0) = ComboBox1.Value Then
                    Me.ComboBox3.AddItem Cel.Offset(, 1).Value
                End If
    '            End If
            Next Cel
        End With
     
    End Sub
     
     
    ' *************************
    ' ** récupération   prix **
    ' *************************
    Private Sub ComboBox3_Change()
    Dim Cel As Range
     
        With Worksheets("tissu")
            For Each Cel In .Range("C2", .Range("C" & Rows.Count).End(xlUp))
                If Cel.Value = Me.ComboBox3.Value Then
     
    Range("B6").Value = ComboBox1.Value ' affiche la coupe en B6
    Range("B7").Value = ComboBox2.Value ' affiche la famille tissu en B7
    Range("B8").Value = ComboBox3.Value ' affiche le tissu en B8
    Range("B9").Value = Cel.Offset(, 1).Value ' affiche le prix du tissu choisi en B9
    Range("C9").Value = Cel.Offset(, 2).Value ' affiche la largeur du tissu choisi en C9
     
                End If
     
            Next Cel
        End With
    Unload FormCoupe ' vide et ferme le formuaire
    End Sub

    Merci pour votre aide

    Jean-Yves

  2. #2
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Bonjour,

    Il s'agit en fait de ce que l'on appelle des Combobox en cascades.
    Classique.

    Voir cette discussion

    Par ailleurs.
    Code issu de mes archives (sauf erreur, de Silkyroad)

    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
    76
    77
    Option Explicit
     
    Dim Ws As Worksheet
    Dim NbLignes As Integer
     
    'Les données sont dans les colonnes A à D, d'un onglet nommé "Base".
    'La procédure effectue un remplissage conditionnel des Combobox en fonction de
    'ce qui est sélectionnée dans le contrôle précédent:
    'La sélection du ComboBox1 (données colonne A) définit le contenu du ComboBox2 (données colonne B) ,
    'La sélection du ComboBox2 définit le contenu du ComboBox3 (données colonne C) …etc...
    '
     
    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
    Enfin, la recherche "Combobox cascades" doit te retourner quelques pistes intéressantes.

  3. #3
    Membre régulier
    Homme Profil pro
    Voilier
    Inscrit en
    Décembre 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Voilier
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2018
    Messages : 7
    Par défaut
    Bonjour,
    Merci pour le retour. J'avais trouvé des informations sur les combobox en cascades, mais je n'arrive pas à les adapter. Je débute en VBA..

    là dans cette prortion de code,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Dim Cel As Range
        With Worksheets("tissu")
            For Each Cel In .Range("B2", .Range("B" & Rows.Count).End(xlUp))
                If Cel.Value = Me.ComboBox2.Value Then
    '            If Cel.Value(-1, 0) = ComboBox1.Value Then
                    Me.ComboBox3.AddItem Cel.Offset(, 1).Value
                End If
    '            End If
            Next Cel
        End With
    je souhaite que cela fasse 'en Français'...
    "Pour chaque enregistrement où la colonne B correspond au ComboBox2 et la colonne A correspond au CombboBox1, j'ajoute à la liste dans le ComboBox3 l'info de la colonne C, sauf si l'enregistrement existe déjà...

    Pas simple tout seul à apprendre!
    Merci

    JY

  4. #4
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Salut,

    Pas simple tout seul à apprendre!
    Tout dépend de ce que tu veux faire.
    C'est comme si un élève du permis de conduire souhaiterait piloter en Formule 1.

    Il y a des bases à acquérir sur les formulaires (Userforms).
    Cette étape franchie, l'adaptation de code ne posera pas de problème.

    Sur les formulaires, voici 2 tutoriels fondamentaux
    Utiliser les formulaires
    Utiliser les contrôles

    Il te sera beaucoup plus profitable de consulter cette documentation (tutoriels + codes ci-dessus) puis de l'adapter.

  5. #5
    Membre régulier
    Homme Profil pro
    Voilier
    Inscrit en
    Décembre 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Voilier
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2018
    Messages : 7
    Par défaut
    Re
    Merci pour les liens

    J'ai tout retravaillé et j'arrive au résultat que je souaitait à savoir 3 combobox en cascade.
    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
     
    Option Explicit
     
    Dim fbd, derLn, ln, dico1, dico2
     
    ' *********************
    ' ** combo n°1 coupe **
    ' *********************
    Private Sub UserForm_initialize()
     
        Set fbd = Sheets("tissu")
        Set dico1 = CreateObject("Scripting.Dictionary")
        Set dico2 = CreateObject("Scripting.Dictionary")
        derLn = fbd.Range("A" & Rows.Count).End(xlUp).Row
        For ln = 2 To derLn
            dico1(fbd.Range("A" & ln).Value) = ""
        Next ln
        ComboBox1.List = Application.Transpose(dico1.keys)
    End Sub
    ' *****************************
    ' ** combo n°2 famille tissu **
    ' *****************************
    Private Sub ComboBox1_Change()
        ComboBox2.Clear
        ComboBox3.Clear
    '    TextBox1 = ""
    '    TextBox2 = ""
        For ln = 2 To fbd.Range("B" & derLn).Row
            If fbd.Range("A" & ln) = ComboBox1 Then
                dico2(fbd.Range("B" & ln).Value) = ""
            End If
        Next ln
        ComboBox2.List = Application.Transpose(dico2.keys)
    End Sub
    ' *********************
    ' ** combo n°3 tissu **
    ' *********************
    Private Sub ComboBox2_Change()
     
        ComboBox3.Clear
    '    TextBox1 = ""
    '    TextBox2 = ""
        For ln = 2 To fbd.Range("B" & derLn).Row
            If fbd.Range("A" & ln) = ComboBox1 And fbd.Range("B" & ln) = ComboBox2 Then
                ComboBox3.AddItem fbd.Range("C" & ln)
            End If
        Next ln
    End Sub
     
    Private Sub ComboBox3_Change()
     
        For ln = 2 To fbd.Range("B" & derLn).Row
            If fbd.Range("A" & ln) = ComboBox1 And fbd.Range("B" & ln) = ComboBox2 _
                    And fbd.Range("C" & ln) = ComboBox3 Then
                Exit For
            End If
        Next ln
            Range("B6").Value = ComboBox1.Value
            Range("B7").Value = ComboBox2.Value
            Range("B8").Value = ComboBox3.Value
            Range("B9").Value = fbd.Range("D" & ln)
            Range("C9").Value = fbd.Range("E" & ln)
     
    ' fermer le formulaire
    Unload FormCoupe
    End Sub
    à part que dans chaque combo j'ai une ligne vide avant ma liste, tout fonctionne bien.
    Encore merci pour le coup de main

    JY

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

Discussions similaires

  1. MINUS avec deux conditions
    Par miketidy dans le forum SQL
    Réponses: 14
    Dernier message: 24/06/2008, 10h57
  2. Remplir une ComboBox avec DEUX colonnes (ou plus ^_^)
    Par DashRendar dans le forum VB.NET
    Réponses: 3
    Dernier message: 07/02/2008, 09h54
  3. Combobox avec deux champs
    Par hajarussa dans le forum VB.NET
    Réponses: 6
    Dernier message: 02/10/2007, 11h11
  4. [VBA-E] Countif avec deux conditions
    Par bonilla dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 04/09/2007, 16h30
  5. Datagrid et combobox avec deux datasource différents
    Par RaelRiaK dans le forum VB.NET
    Réponses: 9
    Dernier message: 07/02/2007, 10h20

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