Generer une liste à partir d'une liste déroulante

Bonjour,

Je reviens encore vers vous décidément j'ai du mal avec Excel.

Je voudrais créer une liste de pièces qui correspondent au choix de la machine.

Si je choisis une des machines dans la liste déroulante en E2 de la feuille "recherche" je voudrais avoir la liste de toutes les pièces de la feuille "base données" qui correspondent à la machine choisie. Bien sûr dans l'ordre alphabétique des "noms" si c'est possible en A8 de la feuille "recherche"

Y a t'il une solution simple.

Merci d'avance pour votre précieuse aide.

Je vous joint un fichier

20test1.xlsx (11.91 Ko)

Bonjour Chounette, bonjour le forum,

Un solution full VBA (oui je sais, je parle couramment l'étranger !...) :

Le code :

Private TEST As Boolean 'déclare la variable TEST (pour éviter les boucles sur la procédure Change)

Private Sub Worksheet_Change(ByVal Target As Range) 'au changement dans l'onglet
Dim BD As Worksheet 'déclare la variable BD (onglet BASE DONNEE)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim COL As Byte 'déclare la variable COL (COLonne)
Dim K As Integer 'déclare la variable K (incrément)
Dim LI As Integer 'déclare la variable LI (LIgne)
Dim I As Integer 'déclare la variable I (Incrément)
Dim TL() As Variant 'déclare la variable TL (Tableau des Lignes)
Dim J As Byte 'déclare la variable J (incrément)

Set BD = Worksheets("BASE DONNEES") 'définit l'onglet BD
TV = BD.Range("A1").CurrentRegion 'définit le tableau des valeurs TV

'****************************
'efface les anciennes données
'****************************
If TEST = True Then Exit Sub 'si TEST est [Vrai], sort de la procédure
TEST = True 'définit la variable TEST
Range("A5:G5").ClearContents 'efface la plage A5:G5
Range("A7").CurrentRegion.Offset(1, 0).ClearContents 'efface d'eventuelles données de recherche par machine

'*********************
'recherche par machine
'*********************
If Target.Address = "$E$2" Then 'condition 1 : si la cellule éditée est la cellule E2
    If Target.Value <> "" Then 'condition 2 : si E2 n'est pas effacée
        Range("A2").Value = "" 'efface la cellule A2
        Range("C2").Value = "" 'efface la cellule C2
        For COL = 4 To UBound(TV, 2) 'boucle 1 : sur les colonnes COL du tableau des valeurs TV (en partant de la quatrième)
            If TV(1, COL) = Target.Value Then Exit For 'si la donnée ligne 1 colonne COL de TV est égale à la valeur de la cellule E2, sort de la boucle
        Next COL 'prochaine colonne de la boucle
        K = 1 'initialise la variable K
        For LI = 2 To UBound(TV, 1) 'boucle 2 : sur toutes les lignes LI du tableau des valeurs TV (en partant de la seconde)
            If TV(LI, COL) <> "" Then 'condition 3 : si la donnée ligne LI colonne COL de TV n'est pas vide
                ReDim Preserve TL(1 To 5, 1 To K) 'redimensionne le tableau des lignes TL (5 lignes, K colonnes)
                For I = 1 To 3 'boucle 3 : sur les 3 premières colonne de TV
                    TL(I, K) = TV(LI, I) 'récupère dans la ligne I (colonne K) de TL  la valeur de la colonne I (ligne LI) de TV  (= transposition)
                Next I 'prochaine ligne de la boucle 3
                TL(4, K) = TV(LI, COL) 'récupère dans la ligne 4 de TL la valeur de la donnée ligne LI colonne Col de TV
                TL(5, K) = Target.Value 'récupère dans la ligne 5 de TL le nom de la machine de la cellule E2
                K = K + 1 'incrémente K (ajoute une colonne au tableau des lignes TL)
            End If 'fin de la condition 3
        Next LI 'prochaine ligne de la boucle 2
        'si K est supérieure à un, renvoie en A8 redimensionnée le tableau TL transposé
        If K > 1 Then Range("A8").Resize(UBound(TL, 2), UBound(TL, 1)).Value = Application.Transpose(TL)
        TEST = False 'réinitialse la variable TEST
        Exit Sub 'sort de la procédure
    End If 'fin de la condition 2
End If 'fin de la condition 1

'***********************
'recherche par référence
'***********************
If Target.Address = "$A$2" Then 'condition 1 : si l'addresse de la cellule éditée est A2
    Range("C2") = "" 'efface C2
    Range("E2").Value = "" 'efface E2
    For I = 2 To UBound(TV, 1) 'boucle 1 : sur toutes les lignes I du tableau des valeurs TV (en partant de la seconde)
        If TV(I, 1) = Target.Value Then 'condition 2 : si la donnée ligne I colonne 1 de TV est égale à la valeur de la cellule A2
            Range("A5").Value = TV(I, 1) 'renvoie en A5 la valeur de la donnée ligne I colonne 1
            Range("B5").Value = TV(I, 2) 'renvoie en B5 la valeur de la donnée ligne I colonne 2
            Range("C5").Value = TV(I, 3) 'renvoie en C5 la valeur de la donnée ligne I colonne 3
            For J = 4 To UBound(TV, 2) 'boucle 2 : sur les colonnes "machines"
                If TV(I, J) <> "" Then 'condition 3 : si la donnée ligne I, colonne J n'est pas vide
                    Cells(5, Application.Columns.Count).End(xlToLeft).Offset(0, 1).Value = TV(1, J) 'renvoie dans la première colonne vide de la ligne 5 le nom de la machine
                End If 'fin de la condition 3
            Next J 'prochaine colonne de la boucle 2
        End If 'fin de la condition 2
    Next I 'prochaine ligne de la boucle 1
End If 'fin de la condition 1

'*****************
'recherche par nom
'*****************
If Target.Address = "$C$2" Then 'condition 1 : si l'addresse de la cellule éditée est C2
    Range("A2") = "" 'efface A2
    Range("E2").Value = "" 'efface E2
    For I = 2 To UBound(TV, 1) 'boucle 1 : sur toutes les lignes I du tableau des valeurs TV (en partant de la seconde)
        If TV(I, 3) = Target.Value Then 'condition 2 : si la donnée ligne I colonne 3 de TV est égale à la valeur de la cellule C2
            Range("A5").Value = TV(I, 1) 'renvoie en A5 la valeur de la donnée ligne I colonne 1
            Range("B5").Value = TV(I, 2) 'renvoie en B5 la valeur de la donnée ligne I colonne 2
            Range("C5").Value = TV(I, 3) 'renvoie en C5 la valeur de la donnée ligne I colonne 3
            For J = 4 To UBound(TV, 2) 'boucle 2 : sur les colonnes "machines"
                If TV(I, J) <> "" Then 'condition 3 : si la donnée ligne I colonne J n'est pas vide
                    Cells(5, Application.Columns.Count).End(xlToLeft).Offset(0, 1).Value = TV(1, J) 'renvoie dans la première colonne vide de la ligne 5 le nom de la machine
                End If 'fin de la condition 3
            Next J 'prochaine colonne de la boucle 2
        End If 'fin de la condition 2
    Next I 'prochaine ligne de la boucle 1
End If 'fin de la condition 1
TEST = False 'reínitialise la variable TEST
End Sub

Les validations de données en A2, C2 et E2 utilisent la formule DECALER. Voir le Gestionnaire de Noms. Arf ! Ce n'est donc plus full VBA ! C'était bien la peine de faire le malin au début...

Le fichier :

29chounette-v01.xlsm (25.28 Ko)
Rechercher des sujets similaires à "generer liste partir deroulante"