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 :

listes déroulantes liées


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2008
    Messages
    145
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 145
    Par défaut listes déroulantes liées
    Bonjour ,

    J'aimerais faire deux listes déroulantes qui s'alimente entre elle selon le choix que je fais dans l'une.

    En gros :
    ma première liste ma deuxième liste
    A 1
    A 2
    B 3
    C 4
    C 5

    Si je sélectionne dans ma première liste : A
    Alors ma deuxième liste affiche seulement : 1, 2.

    J'ai fais un bout de code mais ça marche pas. Quelqu'un pourrait il venir à mon secours, sinon je deviens chauve.

    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
    Private sub UserForm_Initialize()
    Dim J As Integer
    'récupère les données de la colonne A...
    For J=2 to Range ("A65536").End(xlUp).Row
    '...et filtre les doublons
    If ComboBox1.ListIndex=-1 Then ComboBox2.AddItem Range("A"&j)
    Next j
     
    'récupère les données de la colonne B...
    For J=2 to Range ("A65536").End(xlUp).Row
    '...et filtre les doublons
    If ComboBox2.ListIndex=-1 Then ComboBox2.AddItem Range("B"&j)
    Next j
     
    LaDerniere=Application.Workbooks("test.xls").Worksheets ("Feuil1").Cells (4000, 2).End(x1Up).Row
     
    k=1
     
    For i = To LaDerniere
    If Application.Workbooks("test.xls").Worksheets ("Feuil1").Cells (i, 2).Value = 
     
    ComboBox1.Value And Application.Workbooks("test.xls").Worksheets ("Feuil1").Cells (i, 3).Value = ComboBox2.Value Then
    Application.Workbooks("test.xls").Worksheets ("Feuil1").Range ("A"&i&":E"&i&"").Copy
    Application.Workbooks("test.xls").Worksheets ("Feuil1"). Range ("F"&k&"").Select
    ActiveSheet.Paste
     
    k=k+1
     
    End If
    Next i
    End Sub

  2. #2
    Expert confirmé 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 : 52
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 756
    Par défaut
    Bonjour,

    Si tu ne nous dis pas ce qui ne marche pas, les cheveux ne sont pas prêt de repousser

  3. #3
    Membre confirmé
    Inscrit en
    Décembre 2008
    Messages
    145
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 145
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    For J=2 to Range ("A65536").End(xlUp).Row
    '...et filtre les doublons
    If ComboBox1.ListIndex=-1 Then ComboBox2.AddItem Range("A"&j)
    Next j
     
    'récupère les données de la colonne B...
    For J=2 to Range ("A65536").End(xlUp).Row
    '...et filtre les doublons
    If ComboBox2.ListIndex=-1 Then ComboBox2.AddItem Range("B"&j)
    Next j
    Ben en gros dans cette partie, les deux listes déroulantes sont alimentés indépendement l'une de l'autre.

    Moi j'aimerais faire un lien entres elles pour que lorsque je sélectionne une valeur dans une liste l'autre se réactualise par rapport au choix fais.

    Tu comprends mieux Jfontaine. Merci de m'aider

  4. #4
    Expert confirmé 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 : 52
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 756
    Par défaut
    2 morceaux de code

    Charge la combobox1 sans doublons

    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
    Private Sub UserForm_Initialize()
     
    Dim i As Long
    Dim j As Long
    Dim str() As String
    Dim bolTrouve As Boolean
     
    ReDim str(1)
    ComboBox1.Clear
     
    'Charge combobox1 sans doublons
    For i = 1 To 10
     
        bolTrouve = False
     
        For j = 0 To UBound(str)
     
            If str(j) = Range("A" & i).Value Then
                bolTrouve = True
            End If
     
        Next j
     
        If bolTrouve = False Then
            ReDim Preserve str(UBound(str) + 1)
            str(UBound(str)) = Range("A" & i).Value
            ComboBox1.AddItem Range("A" & i).Value
        End If
     
    Next i
     
    End Sub
    Charge la combobox2 en utilisant la premiere
    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 ComboBox1_Change()
    Dim i As Long
    Dim j As Long
    Dim str() As String
    Dim bolTrouve As Boolean
     
    ReDim str(1)
    ComboBox2.Clear
     
    For i = 1 To 10
     
        If Range("A" & i).Value = ComboBox1.Value Then
     
            bolTrouve = False
     
            For j = 0 To UBound(str)
     
                If str(j) = Range("B" & i).Value Then
                    bolTrouve = True
                End If
     
            Next j
     
            If bolTrouve = False Then
                ReDim Preserve str(UBound(str) + 1)
                str(UBound(str)) = Range("B" & i).Value
                ComboBox2.AddItem Range("B" & i).Value
            End If
     
        End If
     
    Next i
    End Sub
    Ce code mériterait peut être d'être amélioré dans la partie gestion des doublons, mais c'est ce qui me vient a cette heure

  5. #5
    Membre confirmé
    Inscrit en
    Décembre 2008
    Messages
    145
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 145
    Par défaut
    Ha oui d'accord !!! là je te dis merci tu me sauve , c'est sur que tu maitrise VBA. Je comprends pas tout dans ton code mais c'est pas grave je me renseignerais.

    Par contre une question , si je veux rajouter une autre liste déroulante tu crois que ça peux marcher ???

    Et je t'avoue que si tu as une idée pour optimiser mon code se serais le bien venu .

    Je te remerci 1000 fois pour ton aide.

    Je comprends pas, ma combobox2 ne fonctionne pas.

    Je sélectionne une valeur dans ma combobox1, et il y a rien qui saffiche dans ma combobox2 ???

    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
    Private Sub ComboBox1_Change()
     
    Dim i As Long
    Dim j As Long
    Dim str() As String
    Dim bolTrouve As Boolean
     
    ReDim str(1)
    ComboBox2.Clear
     
    For i = 2 To 6556
     
        If Range("A" & i).Value = ComboBox1.Value Then
     
            bolTrouve = False
     
            For j = 0 To UBound(str)
     
                If str(j) = Range("B" & i).Value Then
                    bolTrouve = True
                End If
     
            Next j
     
            If bolTrouve = False Then
                ReDim Preserve str(UBound(str) + 1)
                str(UBound(str)) = Range("B" & i).Value
                ComboBox2.AddItem Range("B" & i).Value
            End If
     
        End If
     
    Next i
     
    End Sub


    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
    Private Sub UserForm_Initialize()
     
    Dim i As Long
    Dim j As Long
    Dim str() As String
    Dim bolTrouve As Boolean
     
    ReDim str(1)
    ComboBox1.Clear
     
    'Charge combobox1 sans doublons
    For i = 2 To 6556
     
        bolTrouve = False
     
        For j = 0 To UBound(str)
     
            If str(j) = Range("A" & i).Value Then
                bolTrouve = True
            End If
     
        Next j
     
        If bolTrouve = False Then
            ReDim Preserve str(UBound(str) + 1)
            str(UBound(str)) = Range("A" & i).Value
            ComboBox1.AddItem Range("A" & i).Value
        End If
     
    Next i
     
    End Sub
    Tu peux remarquer que j'ai modifié juste i = 2 to 6556.

  6. #6
    Membre confirmé
    Inscrit en
    Décembre 2008
    Messages
    145
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 145
    Par défaut
    Bon pour ceux qui ont le même problème dirigé vous plutôt sur ce code que j'ai trouvé sur le FAQ.

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

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

Discussions similaires

  1. Debug script listes déroulantes liées
    Par AnTiX dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 20/04/2005, 13h03
  2. Griser 1 liste déroulante liée à une autre, pb de concaténat
    Par linou dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 29/03/2005, 17h45
  3. listes déroulantes liées
    Par k4eve dans le forum Struts 1
    Réponses: 3
    Dernier message: 26/04/2004, 16h11
  4. Listes déroulantes liées entre elles
    Par denisC dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 27/07/2002, 16h53

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