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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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

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, 19h58
  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, 03h29
  3. Réponses: 2
    Dernier message: 19/12/2007, 20h06
  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, 21h54

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