Monsieur Excel
Pour tout savoir faire sur Excel !

07 octobre 2014

Liste déroulante à deux étages

Dans la cellule B1, vous avez créé, grâce à la commande DonnéesValidationListe, un menu déroulant avec les deux options « Fruit » et
« Légume ». Vous souhaitez définir en B2 une liste de validation différente selon le choix effectué en B1, comme dans l'exemple ci-dessous :


Vous pouvez résoudre ce problème de façon tout à fait esthétique grâce à la macro événementielle ci-dessous, attachée à la feuille de calcul concernée.

Private Sub Worksheet_Change(ByVal Target As Range)
Dim Liste As String
On Error Resume Next
    If Target = Range("B1") Then
        Application.EnableEvents = False
        Select Case Range("B1").Value
        Case "Légume"
            Liste = "Carotte,Tomate,Asperge"
        Case "Fruit"
            Liste = "Pomme,Fraises,Pêche,Abricots"
        End Select
        Range("Sélection").Validation.Modify Formula1:=Liste
        Range("Sélection").ClearContents
        Application.EnableEvents = True
    End If
End Sub

Remarque 1 – Notez, dans les chaînes de validation, l’utilisation de la virgule au lieu du point-virgule : en effet, le VBA est en anglais, langue dans laquelle c’est la virgule qui doit être utilisée à cet effet !

Remarque 2 – La cellule B2 porte le nom "Sélection", ce qui rend la macro stable même si la position de cette cellule est modifiée par la suite...

Remarque 3 – La solution proposée dans cet article fonctionne très bien mais présente deux inconvénients, la rigidité du code et la limitation à deux niveaux.

La rigidité du code tient à ce que les options sont inscrites dans le code VBA : il faut donc modifier le code si l’on désire renommer les options ou modifier leur nombre. Ce n’est pas très flexible, et tout le monde ne maîtrise pas le VBA…

Cette macro fonctionne pour une liste à deux niveaux. Cela deviendrait bien plus délicat avec une liste déroulante à trois niveaux.

Nous résoudrons ces problèmes dans des articles ultérieurs.



7 Commentaire(s):

  • Bonsoir
    J'ai le même pb avec Excel 2010. Par contre en mettant le code dans un module, le pb disparait ...
    Jeff

    By Anonymous Anonyme, sur 6:05 PM  

  • Bonsoir
    Pour moi c'est normal que cela ne fonctionne pas:
    on clique sur la cellule pour la sélectionner puis on clique une deuxième fois pour afficher la liste, il n'y a pas de selectionchange (c'est une hypothèse, si vous dites que ça fonctionnait avant il y a sans doute une subtilité dans la façon dont Excel interprète le clic dans la liste de validation comme un changement de sélection ou pas).
    En revanche si on utilise Worksheet_change ça fonctionne parfaitement.

    By Blogger Philippe, sur 9:10 PM  

  • Bonjour
    La liste déroulante multi-étages fonctionne très bien en combinant la fonction "INDIRECT()" et la fonction de validation.
    Mais je laisse le soin à M. THIRIEZ d'expliquer cela dans ses prochains articles.

    By Blogger JLM, sur 4:40 PM  

  • Bonjour,

    Le fonctionnement que vous décrivez est tout à fait normal :

    Quand on clique sur B1, ça met à jour la liste en fonction du contenu actuel de B1.

    Qu'on change ou non la sélection en B1 n'a aucune action, si ce n'est actualiser le contenu de B1.

    Quand on clique sur B2, le contenu de la liste s'affiche, mais c'est celui qui correspond à la valeur qu'il y avait en B1 quand on a cliqué sur B1, et non à la valeur actuelle de B1 puisque la liste de B2 n'a pas été mise à jour après la sélection en B1.

    Quand on reclique en B1, la liste de B2 est alors mise à jour en fonction du contenu actuel de B1.
    Donc si on ne change pas la valeur en B1 et qu'on revient sur B2, on a alors la liste que l'on voulait.


    Ce n'est biensûr pas "SelectionChange" qu'il faut utiliser, mais "Change".

    By Anonymous Anonyme, sur 3:51 AM  

  • Bonjour,

    Si l'on mettait B2 en Target ?

    By Anonymous Anonyme, sur 4:50 PM  

  • Merci pour tous vos commentaires.

    Du coup, j'ai modifié le texte de l'article pour les intégrer :)

    By Blogger Hervé Thiriez, sur 7:44 PM  

  • Ce commentaire a été supprimé par un administrateur du blog.

    By Anonymous Anonyme, sur 4:57 AM  

Enregistrer un commentaire

<< Accueil