XL 2016 Listes déroulantes avec affichage de plusieurs colonnes en lien avec une base de données

ralph45

XLDnaute Impliqué
Bonjour @tou.te.s,

Dans le fichier joint, je voudrai mettre en place des listes déroulantes dans l'onglet "SYNTHESE" sur les cellules B4 à E16...

La particularité de ces listes déroulantes serait que l'affichage lors du choix soit une concaténation particulière d'informations en lien avec une base de données, que j'ai de façon très originale (vous le constaterez ;) ) nommée en onglet "BDD"...

Le résultat du choix de cette liste déroulante serait un champ en particulier et non la concaténation des informations proposée.

Je pourrai contourner cet obstacle - à mon niveau - en insérant des cellules de résultats des choix avec la fonction RECHERCHEV, mais cela démultiplierait la structure du tableau de synthèse (ce que je ne veux pas), pour optimiser la lisibilité de celui-ci.

Je pense avoir tout résumé dans le fichier test proposé.

NB
: tous mes champs en "BDD" ont un nom de plage défini et le petit "plus" serait appréciable...

Merci de votre aide & lumières.
 

Pièces jointes

  • VBA_ListeDeroulante_Bdd.xlsm
    13.6 KB · Affichages: 19

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour,

Dans le fichier joint, je me suis permis de transformer votre plage de cellules des la BDD en tableau structuré nommé "T_BDD" (Vous avez office 2016, il est temps de vous mettre aux tableaux structurés pour vos données).

Il y a une Combobox (activeX) sur la feuille qui se masque si on est en dehors de la plage C4:E16 et se positionne sur la bonne cellule, dans une largeur suffisante et renvoie le code de la colonne 'Personnel'.

Dans le code de la feuille SYNTHESE :
VB:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim adr As String
    With cbxChoix
        .Visible = Not Intersect(Target, Range("$C$4:$E$16")) Is Nothing And Target.CountLarge = 1
        If .Visible Then
            adr = "SYNTHESE!" & Target.Address
            .ListFillRange = "'BDD'!" & Sheets("BDD").Range("T_BDD[[Choix]:[Personnel]]").Address
            .Left = Target.Left
            .Top = Target.Top
            .Height = Target.Height
            .ListRows = 15
            On Error Resume Next
            'Si la valeur de la cellule n'est pas dans la liste alors Erreur!
            .LinkedCell = adr
            On Error GoTo 0
        End If
    End With
End Sub

Voici donc l'idée, à vous d'adapter.

Cordialement
 

Pièces jointes

  • VBA_ListeDeroulante_Bdd.xlsm
    28.5 KB · Affichages: 17

ralph45

XLDnaute Impliqué
Bonjour le forum et bonjour @Roblochon

Le résultat obtenu est bien celui que je désirai. Parfait et un grand merci !

Mais j'ai tenté de l'adapter en insérant d'autres BDD (2 & 3) et d'autres listes déroulantes (Colonnes F à I), et là, je n'obtiens plus rien. Voici le code modifié plus bas

NB : pour les version d'Excel, c'est un peu la foire : cela dépend sur quel environnement on travaille
a) En client lourd, on est sur la dernière version d'Excel (enfin bureautique).
b) En client léger, on est sur Excel 2010.

VB:
Option Explicit
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim adr As String
    ' Choix_Personnel
    With cbxChoix
        .Visible = Not Intersect(Target, Range("$C$4:$E$16")) Is Nothing And Target.CountLarge = 1
        If .Visible Then
            adr = "SYNTHESE!" & Target.Address
            .ListFillRange = "'BDD'!" & Sheets("BDD").Range("T_BDD[[Choix]:[Personnel]]").Address
            .Left = Target.Left
            .Top = Target.Top
            .Height = Target.Height
            .ListRows = 15
            On Error Resume Next
            'Si la valeur de la cellule n'est pas dans la liste alors erreur
            .LinkedCell = adr
            On Error GoTo 0
        End If
    End With
        ' Choix_Vehicule
    With cbxChoix
        .Visible = Not Intersect(Target, Range("$F$4:$G$16")) Is Nothing And Target.CountLarge = 1
        If .Visible Then
            adr = "SYNTHESE!" & Target.Address
            .ListFillRange = "'BDD2'!" & Sheets("BDD2").Range("T_BDD2[[Choix]:[Vehicule]]").Address
            .Left = Target.Left
            .Top = Target.Top
            .Height = Target.Height
            .ListRows = 15
            On Error Resume Next
            'Si la valeur de la cellule n'est pas dans la liste alors erreur
            .LinkedCell = adr
            On Error GoTo 0
        End If
    End With
        ' Choix_Nuit
    With cbxChoix
        .Visible = Not Intersect(Target, Range("$H$4:$I$16")) Is Nothing And Target.CountLarge = 1
        If .Visible Then
            adr = "SYNTHESE!" & Target.Address
            .ListFillRange = "'BDD3'!" & Sheets("BDD3").Range("T_BDD3[[Choix]:[Lieu]]").Address
            .Left = Target.Left
            .Top = Target.Top
            .Height = Target.Height
            .ListRows = 15
            On Error Resume Next
            'Si la valeur de la cellule n'est pas dans la liste alors erreur
            .LinkedCell = adr
            On Error GoTo 0
        End If
    End With
End Sub
 

Pièces jointes

  • VBA_ListeDeroulante_Bdd2.xlsm
    32.9 KB · Affichages: 6

Discussions similaires