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 combobox,condition et autre combo


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2019
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2019
    Messages : 35
    Par défaut Remplir combobox,condition et autre combo
    Salut,

    J'ai reussi à remplir une liste d'un combobox1 ( la liste se trouver sur une plage de cellule, donc facile )

    Mais maintenant je veux remplir un combobox2 mais selon le choix que je fais dans mon premier combobox1 ( la valeur selectrionné par l'utilisateur dans la liste deroulante )
    Le combobox2 doit se remplir toujours avec une plage de cellule, mais cette fois sous condition, je m'explique :

    Je dois parcour un ensemble de colonne, et je dois dire si la valeur selectionné dans combobox1 est égale à la valeur qu'on parcour dans UNE colonne, alors : on prend la valeur de la colonne d'a coté sur la même ligne et on l'ajoute dans la liste du combobox1
    voici mon code( avec les nom changé ) :

    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
     
    Private Sub comboboxListePrincipale_Change()
            combobox2_rchg.Clear
            combobox3.Clear
            combobox4.Clear
     
            Dim i As Long
            Dim j As Long
            Dim DernLigne As Long
     
        DernLigne = wksfd.Range("C1048576").End(xlUp).Row
        MsgBox DernLigne
        For i = 4 To DernLigne
     
                If wksfd.Cells(i, 8).Value = comboboxListePrincipale.Value Then
                    If wksfd.Cells(i, 4).Value <> "" Then
                        combobox2_rchg.AddItem wksfd.Cells(i, 4).Value
                    ElseIf wksfd.Cells(i, 5).Value <> "" And wksfd.Cells(i, 6).Value <> "" Then
                        combobox3.AddItem wksfd.Cells(i, 5).Value
                        combobox4.AddItem wksfd.Cells(i, 6).Value
     
                    End If
     
                End If
     
                Next i
     
    End Sub

    Merci beaucoup !

    PS : toutes les combobox sont rempli avec des nombres !

  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 Gioge,

    Pour l'alimentation des items, mieux vaut utiliser la méthode AddItem que la propriété RowSource.

    La problématique que tu soulèves est classique.
    Elle a pour nom "Combobox en cascades."

    Une recherche rapide te donnera plusieurs solutions dont
    cette discussion

  3. #3
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    bonjour a tous

    perso j'ai un soucis avec cette logique moi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    If wksfd.Cells(i, 8).Value = comboboxListePrincipale.Value Then
                    If wksfd.Cells(i, 4).Value <> "" Then
                        combobox2_rchg.AddItem wksfd.Cells(i, 4).Value
                    ElseIf wksfd.Cells(i, 5).Value <> "" And wksfd.Cells(i, 6).Value <> "" Then
                        combobox3.AddItem wksfd.Cells(i, 5).Value
                        combobox4.AddItem wksfd.Cells(i, 6).Value
     
                    End If
     
                End If
    j'opterais pour un, select case

    non pas qu'elle fonctionne pas mais chez moi un test if elseif se fait sur la même chose

    pourquoi?
    et bien si ta cell(i,4)<>"" et que la (i,5) et (i,6) sont aussi<>"" que devrait on faire selon ton souhait?

    est ce que ton test if elseif représente bien ce que tu veux faire??
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2019
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2019
    Messages : 35
    Par défaut
    Citation Envoyé par patricktoulon Voir le message

    Salut, théoriquement dans ma base de données, soit la cells(i,4) est remplie par un nombre, soit elle est vide et alors c'est les 2 autres qui sont remplis ( qui sont un couple de 2 nombres ),
    et vice versa, si cells(i,5) et (i,6) sont vides, alors la cells(i,4) est remplie.

    Avoir seulement (i,5) rempli, ou avoir (i,4) et (i,6) rempli est une erreur de saisie dans la base de données
    Que me proposes-tu en select case ? Tu penses que ça devrait remplir mes 3 combo qui dépendent du combo principal ?

    Merci

    Citation Envoyé par MarcelG Voir le message
    Justement j'utilise bien AddItem, et pas de rowsource comme tu peux le voir sur mon code

    Merci du lien, je vais regarder, et voir si je comprends

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2019
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2019
    Messages : 35
    Par défaut
    Rebonjour,

    Je n'arrive pas à comprendre l'autre topic...
    J'ai crée un fichier par contre pour vous montrez ce que je cherche à faire :
    combo partir combov2.xlsm

    Merci

  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
    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
    Option Explicit
     
    Dim DernLigne As Long
     
    Private Sub UserForm_Initialize()
    Dim Itm As String
    Dim i As Long
     
    With Feuil1
        DernLigne = .Cells(.Rows.Count, 2).End(xlUp).Row
        For i = 3 To DernLigne
            Itm = .Cells(i, 2).Value
            With Me.ComboBoxPrinci
                .Value = Itm
                If .ListIndex = -1 Then .AddItem Itm
            End With
        Next i
    End With
    End Sub
     
    Private Sub ComboBoxPrinci_Change()
    Dim i As Long
     
    Me.ComboBox2.Clear
    Me.ComboBox3.Clear
    Me.ComboBox4.Clear
    With Feuil1
        For i = 3 To DernLigne
            If .Cells(i, 2).Text = Me.ComboBoxPrinci.Value Then
                If .Cells(i, 4).Value <> "" Then
                    Me.ComboBox2.AddItem .Cells(i, 4).Value
                ElseIf .Cells(i, 5).Value <> "" And .Cells(i, 6).Value <> "" Then
                    Me.ComboBox3.AddItem .Cells(i, 5).Value
                    Me.ComboBox4.AddItem .Cells(i, 6).Value
                End If
            End If
        Next i
    End With
    End Sub

  7. #7
    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
    Hé salut à toi ô grand parmi les grands!

    Juste un détail.
    A mon avis, mieux vaut énoncer un bloc Select Case (éventuellement à True) plutôt que d'imbriquer des blocs If.
    Depuis 10 ans, pour ma part, je n'ai jamais utilisé l'instruction ElseIf.

    A plus.

  8. #8
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2019
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2019
    Messages : 35
    Par défaut
    Citation Envoyé par mercatog Voir le message
    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
    Option Explicit
     
    Dim DernLigne As Long
     
    Private Sub UserForm_Initialize()
    Dim Itm As String
    Dim i As Long
     
    With Feuil1
        DernLigne = .Cells(.Rows.Count, 2).End(xlUp).Row
        For i = 3 To DernLigne
            Itm = .Cells(i, 2).Value
            With Me.ComboBoxPrinci
                .Value = Itm
                If .ListIndex = -1 Then .AddItem Itm
            End With
        Next i
    End With
    End Sub
     
    Private Sub ComboBoxPrinci_Change()
    Dim i As Long
     
    Me.ComboBox2.Clear
    Me.ComboBox3.Clear
    Me.ComboBox4.Clear
    With Feuil1
        For i = 3 To DernLigne
            If .Cells(i, 2).Text = Me.ComboBoxPrinci.Value Then
                If .Cells(i, 4).Value <> "" Then
                    Me.ComboBox2.AddItem .Cells(i, 4).Value
                ElseIf .Cells(i, 5).Value <> "" And .Cells(i, 6).Value <> "" Then
                    Me.ComboBox3.AddItem .Cells(i, 5).Value
                    Me.ComboBox4.AddItem .Cells(i, 6).Value
                End If
            End If
        Next i
    End With
    End Sub

    Merci beaucoup après adaptation et légère modification ça fonctionne

    Par contre, mes combo2, 3 et 4 ont des doublons.
    Sur les colonnes de ma feuille j'ai effectivement des doublons, car pour une même valeur de comboprinci, je peux avoir plusieurs valeur différente de combo2 ou du couple (combo3 et 4), ou alors pour des valeurs differente de comboprinci, je peux avoir les mêmes valeurs de combo2 ou du couple (combo3/4).

    Par contre lorsque je dois choisir, dans mon Userform, je ne dois pas avoir de doublons ( donc aucune liste des combobox )

    Merci

  9. #9
    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,

    En adoptant la même architecture que celle du code de mercatog, il est possible de créer des dictionnaires afin d'obtenir des items de Combobox sans doublon.

    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
    Private Sub ComboBoxPrinci_Change()
     
    Dim i As Long
     
    Me.ComboBox2.Clear
    Me.ComboBox3.Clear
    Me.ComboBox4.Clear
     
    Dim dico2 As Scripting.Dictionary
    Set dico2 = CreateObject("Scripting.Dictionary")
     
    Dim dico3 As Scripting.Dictionary
    Set dico3 = CreateObject("Scripting.Dictionary")
     
    Dim dico4 As Scripting.Dictionary
    Set dico4 = CreateObject("Scripting.dictionary")
     
    With Feuil1
     
        For i = 3 To DernLigne
     
            If .Cells(i, 2).Text = Me.ComboBoxPrinci.Value Then
     
                Select Case True
     
                        Case .Cells(i, 4).Value <> ""
                                If Not dico2.Exists(.Cells(i, 4).Value) Then
                                        dico2.Add .Cells(i, 4).Value, .Cells(i, 4).Value
                                        Me.ComboBox2.AddItem .Cells(i, 4).Value
                                End If
     
                        Case .Cells(i, 5).Value <> "" And .Cells(i, 6).Value <> ""
                                If Not dico3.Exists(.Cells(i, 5).Value) Then
                                        dico3.Add .Cells(i, 5).Value, .Cells(i, 5).Value
                                        Me.ComboBox3.AddItem .Cells(i, 5).Value
                                End If
                                If Not dico4.Exists(.Cells(i, 6).Value) Then
                                        dico4.Add .Cells(i, 6).Value, .Cells(i, 6).Value
                                        Me.ComboBox4.AddItem .Cells(i, 6).Value
                                End If
     
                End Select
     
     
            End If
     
        Next i
     
    End With
     
    dico4.RemoveAll
    Set dico4 = Nothing
     
    dico3.RemoveAll
    Set dico3 = Nothing
     
    dico2.RemoveAll
    Set dico2 = Nothing
     
    End Sub

  10. #10
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2019
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2019
    Messages : 35
    Par défaut
    Merci Marcel, mais j'ai une erreur "Type defini par l'utilisateur non defini" à la ligne où tu commence a crée les dicos : Dim dico2 As Scripting.Dictionary

  11. #11
    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,

    Cette erreur est logique.
    J'ai oublié de préciser qu'il te fallait, au préalable, activer la référence
    Microsoft Scripting.RunTime
    Pour ce faire dans l'éditeur VBE:
    - Menu Outils\Références
    - Cocher "Microsoft Scripting.RunTime", les références étant classées par ordre alaphabétique.

  12. #12
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2019
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2019
    Messages : 35
    Par défaut
    Oui, et il fallait aussi ajouter "New" et écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim dico2 As New Scripting.Dictionary
    Set dico2 = CreateObject("Scripting.Dictionary")

    Sinon j'essaye de faire tourner le code avec f8 - pas à pas detaillé, mais ça mouline infiniment, et je ne peux pas avancé dans le code, comment faire pour que je puisse avancé après la boucle merci

  13. #13
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    bonjour a tous

    sérieux Marcel des dicos???

    perso d'après les explications en post #4 je vois ca

    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
    Private Sub UserForm_Initialize()
       With Feuil1
        DernLigne = .Cells(.Rows.Count, 2).End(xlUp).Row
        For i = 3 To DernLigne
            Itm = .Cells(i, 2).Value
            With Me.ComboBoxPrinci
                .Value = Itm
                If .ListIndex = -1 Then .AddItem Itm
            .ListIndex = -1
            End With
        Next i
    End With
    End Sub
    '
    '
    Private Sub ComboBoxPrinci_Change()
        Dim i As Long, j As Long, DernLigne As Long, Ok As Boolean, F As Worksheet
        ComboBox2.Clear: ComboBox3.Clear: ComboBox4.Clear
     
        Set F = Sheets("Feuil1")
        DernLigne = F.Range("B" & Rows.Count).End(xlUp).Row
        For i = 3 To DernLigne
            Ok = F.Cells(i, 2).Value = Val(ComboBoxPrinci.Value)
            Select Case True
            Case Ok And F.Cells(i, 4).Value <> ""
                ComboBox2.AddItem F.Cells(i, 4).Value
            Case Ok And F.Cells(i, 5).Value <> "" And F.Cells(i, 6).Value <> ""
                ComboBox3.AddItem F.Cells(i, 5).Value
                ComboBox4.AddItem F.Cells(i, 6).Value
            End Select
     
        Next i
    End Sub
    maintenant revenons a mon interrogation sur la logique
    prenons un des chiffre en combo principale
    exemple le 53
    nous l'avons en ligne 3,19,24

    donc le premier va remplir la combo2 puisque il y a 410 en "D"mais pas les combo 3 et 4
    l'occurrence suivante va faire pareil il y a 478 en "D"
    et nous voila avec la derniere occurrence vide en "D" donc remplissage des combo 3 et 4 avec "110 " et "111"

    si bien que a la fin on a 410,478 en combo2;110 en combo 3 et 111 en combo 4

    je précise ma question quand a mon interrogation (post #3):::comment va etre exploité cette organisation des nombre dans les ComboBox??????
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  14. #14
    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
    Gioge,
    Oui, et il fallait aussi ajouter "New" et écrire
    Oui dans l'absolu.
    Mais ici, en fin de procédure, je libère la variable.
    Par principe, tu as raison.

    Sinon j'essaye de faire tourner le code avec f8 - pas à pas détaillé, mais ça mouline infiniment, et je ne peux pas avancé dans le code
    Sur quelle partie du code y a-t-il blocage?
    A ce stade de la discussion, tu peux joindre un classeur, débarrassé de toute donnée confidentielle

  15. #15
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2019
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2019
    Messages : 35
    Par défaut
    Le code fonctionne, si je l’exécute, l'userform se lance et se charge bien, mais lorsque je veux analyser en mode pas à pas le reste du code de mon programme j'ai besoin de commencer par ouvrir l'userform et entrer les données, mais la boucle de l'userform_change et initialise est infinie (en mode pas à pas ), j'ai passé 5min avec le bouton f8 enfoncé, ça mouline sans arrêt.

  16. #16
    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,

    Sur la base du classeur que tu as reporté plus avant, j'ai adapté mon code ainsi
    (Dernligne a une portée module)

    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
    Option Explicit
    Dim DernLigne As Long
     
    Private Sub UserForm_Initialize()
        Dim i As Long
    '    On Error Resume Next
        DernLigne = Range("B" & Rows.Count).End(xlUp).Row
        ComboBoxPrinci.Clear
        For i = 3 To DernLigne
             ComboBoxPrinci.AddItem Range("B" & i).Value
        Next i
    End Sub
     
    Private Sub ComboBoxPrinci_Change()
     
    Dim i As Long
     
    Me.ComboBox2.Clear
    Me.ComboBox3.Clear
    Me.ComboBox4.Clear
     
    Dim dico2 As Scripting.Dictionary
    Set dico2 = CreateObject("Scripting.Dictionary")
     
    Dim dico3 As Scripting.Dictionary
    Set dico3 = CreateObject("Scripting.Dictionary")
     
    Dim dico4 As Scripting.Dictionary
    Set dico4 = CreateObject("Scripting.dictionary")
     
    With Feuil1
     
        For i = 3 To DernLigne
     
            If .Cells(i, 2).Text = Me.ComboBoxPrinci.Value Then
     
                Select Case True
     
                        Case .Cells(i, 4).Value <> ""
                                If Not dico2.Exists(.Cells(i, 4).Value) Then
                                        dico2.Add .Cells(i, 4).Value, .Cells(i, 4).Value
                                        Me.ComboBox2.AddItem .Cells(i, 4).Value
                                End If
     
                        Case .Cells(i, 5).Value <> "" And .Cells(i, 6).Value <> ""
                                If Not dico3.Exists(.Cells(i, 5).Value) Then
                                        dico3.Add .Cells(i, 5).Value, .Cells(i, 5).Value
                                        Me.ComboBox3.AddItem .Cells(i, 5).Value
                                End If
                                If Not dico4.Exists(.Cells(i, 6).Value) Then
                                        dico4.Add .Cells(i, 6).Value, .Cells(i, 6).Value
                                        Me.ComboBox4.AddItem .Cells(i, 6).Value
                                End If
     
                End Select
     
     
            End If
     
        Next i
     
    End With
     
    dico4.RemoveAll
    Set dico4 = Nothing
     
    dico3.RemoveAll
    Set dico3 = Nothing
     
    dico2.RemoveAll
    Set dico2 = Nothing
     
    End Sub
    Le code s'exécute immédiatement.

    Nous avons, Patrick, mercatog et moi-même répondu à ta problématique.
    (Au passage, je donne acte à Patrick quant à l'emploi de dictionnaire(s))

    Je viens d'approfondir le sujet en consultant des données.
    Je me dis que la remarque de Patrick est fondée.
    En effet, il n'y a pas, sur la base du code reporté et corrigé, corrélation entre les 3 zones de liste.
    Tu peux effectuer un essai en effectuant les mêmes constats que lui.

    Pour gérer un ensemble de zones de liste en cascade, il faut que la base de données initiale soit "propre".
    - Pas de cellules, et encore moins de colonnes vierges.
    - Des données corrélées.
    Une "vraie" base de données en quelque sorte.
    Je dirais même que c'est le fondement de tout développement.
    Il sera difficile au menuisier de fabriquer une porte destinée à une cloison branlante.

    En conséquence, je partage l'interrogation de Patrick.

    Voilà.

  17. #17
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    re
    marcel

    au mieux l'exploitation se fera combo par combo
    mais ca veux dire qu'au click ou change du combo il faudra RE!! chercher la ligne correspondante dans la feuille
    mais c'est pas vraiment top
    code a répétition etc.....


    alors qu'en gardant tout les doublons(ligne complète dans un SEUL COMBO!! a 4 colonnes )il suffit synchroniser les index combo/feuille et même avec un TS)
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  18. #18
    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 Patrick,

    Excuse-moi. Fin de journée.
    Qu'entends-tu par
    même avec un TS
    ?

    Bonne soirée à toi.
    Bonne soirée au Forum.

  19. #19
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    re
    TS="tableau structuré"


    tel quel avec le fichier qu'il a donné en exemple

    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
     
     
     
    Private Sub UserForm_Initialize()
        With Feuil1
            DernLigne = .Cells(.Rows.Count, 2).End(xlUp).Row
            For i = 3 To DernLigne
                Itm = .Cells(i, 2).Value
                With Me.ComboBoxPrinci
                    .Value = Itm
                    If .ListIndex = -1 Then .AddItem Itm
                    .ListIndex = -1
                End With
            Next i
        End With
        ComboBox2.ColumnCount = 5
        ComboBox2.ColumnWidths = "55;50;30;30;30"
    End Sub
    '
    '
    Private Sub ComboBoxPrinci_Change()
        Dim i As Long, j As Long, DernLigne As Long, Ok As Boolean, F As Worksheet
        ComboBox2.Clear:
        Set F = Sheets("Feuil1")
        DernLigne = F.Range("B" & Rows.Count).End(xlUp).Row
        With ComboBox2
            For i = 3 To DernLigne
                If F.Cells(i, 2).Value = Val(ComboBoxPrinci.Value) Then
                    .AddItem ComboBoxPrinci.Value & "  en ligne "
                    .List(.ListCount - 1, 1) = i
                    .List(.ListCount - 1, 2) = F.Cells(i, 4).Value
                    .List(.ListCount - 1, 3) = F.Cells(i, 5)
                    .List(.ListCount - 1, 4) = F.Cells(i, 6)
                End If
            Next i
            .DropDown
     
        End With
    End Sub
    il ne sera jamais perdu :il a les index en colonne 2(.list(.listindex,1) de la combo

    Nom : demo2.gif
Affichages : 1538
Taille : 431,4 Ko

    que ce soit avec un range ou TS c'est pareil
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  20. #20
    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 Patrick, Bonjour le Forum,

    Merci pour ces précisions.
    Il est vrai que les combobox à plusieurs colonnes peuvent rendre service aux développeurs, à commencer par moi.

    Bonne journée.

Discussions similaires

  1. [XL-2003] Remplir une combobox d'un autre classeur Excel
    Par Iceabyssal dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 22/07/2009, 18h58
  2. ADO remplir combobox d'aprés une autre combobox
    Par frack dans le forum VBA Access
    Réponses: 14
    Dernier message: 09/02/2008, 02h29
  3. Réponses: 2
    Dernier message: 19/12/2007, 19h06
  4. remplir combobox suivant la sélection d'un autre
    Par wiss20000 dans le forum Servlets/JSP
    Réponses: 8
    Dernier message: 17/05/2007, 20h54

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