Une liste déroulante Excel est idéale pour guider la saisie et éviter les fautes de frappe. Mais dès que l’on souhaite sélectionner plusieurs éléments dans une même cellule, Excel montre rapidement ses limites : la validation des données autorise nativement un seul choix à la fois.
Bonne nouvelle : avec un peu de VBA, il est possible de transformer une liste déroulante classique en véritable menu interactif. L’utilisateur peut alors choisir plusieurs valeurs, les afficher dans une seule cellule et même éviter les doublons.
Dans ce tutoriel, nous allons créer une liste déroulante à choix multiples, la personnaliser avec un séparateur lisible et ajouter une option pratique pour supprimer un choix déjà sélectionné. Pas besoin de développer une application complète : quelques lignes de code suffisent.
Pourquoi créer une liste déroulante à choix multiples dans Excel ?
Imaginez un tableau de suivi de projets. Une tâche peut concerner plusieurs services : Marketing, Commercial et Informatique. Avec une liste déroulante classique, vous devez choisir un seul service ou saisir manuellement les différentes valeurs.
Cette saisie manuelle pose plusieurs problèmes :
Une liste déroulante à choix multiples permet de sélectionner plusieurs éléments prédéfinis, par exemple :
Marketing, Commercial, Informatique
Le résultat reste contenu dans une seule cellule, ce qui est pratique pour les formulaires, les tableaux de suivi, les fiches clients ou encore les plannings.
La limite des listes déroulantes classiques
Avant de parler de VBA, rappelons comment fonctionne une liste déroulante Excel traditionnelle. Elle se crée depuis l’onglet Données, avec la commande Validation des données.
Dans la fenêtre qui s’affiche, il suffit de choisir :
La cellule affiche alors une petite flèche. Un clic permet de choisir une valeur, mais chaque nouvelle sélection remplace la précédente. Excel ne propose pas directement une option “autoriser plusieurs choix”.
C’est ici que VBA intervient. Le code va détecter la nouvelle valeur sélectionnée, récupérer l’ancienne valeur et combiner les deux dans la même cellule.
Préparer la liste des choix
Commençons par créer les valeurs qui apparaîtront dans le menu. Dans un nouvel onglet nommé Listes, saisissez par exemple :
Supposons que ces valeurs soient placées dans la plage Listes!A2:A6. Dans votre feuille principale, sélectionnez ensuite la plage où la liste déroulante doit être disponible. Pour l’exemple, nous utiliserons la colonne D, de D2 à D100.
Rendez-vous dans Données > Validation des données, choisissez le type Liste, puis indiquez comme source :
=Listes!$A$2:$A$6
Vous pouvez également utiliser un nom de plage. Cette méthode est particulièrement pratique si la liste évolue régulièrement. Sélectionnez la plage des choix, cliquez dans la zone de nom située à gauche de la barre de formule et saisissez par exemple :
ListeServices
Dans la validation des données, la source sera alors :
=ListeServices
La liste déroulante fonctionne maintenant, mais elle ne permet toujours qu’une seule sélection. Il est temps d’ajouter le comportement interactif.
Ajouter le code VBA pour autoriser plusieurs choix
Pour ouvrir l’éditeur VBA, utilisez le raccourci Alt + F11. Dans le volet de gauche, repérez le classeur concerné, puis double-cliquez sur la feuille dans laquelle se trouve la liste déroulante.
Attention : le code doit être placé dans le module de la feuille concernée, et non dans un module standard. Si votre liste est présente dans la feuille “Suivi”, double-cliquez bien sur cette feuille dans l’éditeur VBA.
Collez ensuite le code suivant :
Private Sub Worksheet_Change(ByVal Target As Range) Dim ancienneValeur As String Dim nouvelleValeur As String Dim separateur As String separateur = ", " If Target.CountLarge > 1 Then Exit Sub If Intersect(Target, Range("D2:D100")) Is Nothing Then Exit Sub On Error GoTo Sortie Application.EnableEvents = False nouvelleValeur = Target.Value Application.Undo ancienneValeur = Target.Value If ancienneValeur = "" Then Target.Value = nouvelleValeur ElseIf nouvelleValeur = "" Then Target.Value = ancienneValeur Else If InStr(1, separateur & ancienneValeur & separateur, _ separateur & nouvelleValeur & separateur, _ vbTextCompare) = 0 Then Target.Value = ancienneValeur & separateur & nouvelleValeur Else Target.Value = ancienneValeur End If End IfSortie: Application.EnableEvents = TrueEnd Sub
Fermez ensuite l’éditeur VBA avec Alt + F4, puis testez la liste déroulante dans une cellule de la plage D2:D100.
Choisissez “Marketing”, puis ouvrez à nouveau la liste et sélectionnez “Commercial”. La cellule doit maintenant afficher :
Marketing, Commercial
Si vous sélectionnez une troisième valeur, elle sera ajoutée à la suite. Le code empêche également de sélectionner deux fois le même élément. Excel ne transforme donc pas votre cellule en une collection de doublons interminable.
Comprendre le fonctionnement du code
Le code utilise l’événement Worksheet_Change. Celui-ci se déclenche automatiquement lorsqu’une cellule de la feuille est modifiée.
La ligne suivante limite le fonctionnement à la plage D2:D100 :
If Intersect(Target, Range("D2:D100")) Is Nothing Then Exit Sub
Si vous souhaitez utiliser la liste dans une autre zone, modifiez simplement cette plage. Par exemple, pour les cellules B5:B50 :
If Intersect(Target, Range("B5:B50")) Is Nothing Then Exit Sub
La commande Application.Undo est essentielle. Lorsque l’utilisateur choisit une nouvelle valeur, Excel remplace l’ancienne. Le code mémorise donc la nouvelle valeur, annule temporairement la modification, récupère l’ancienne valeur, puis assemble les deux.
La variable separateur définit le texte placé entre les choix :
separateur = ", "
Vous pouvez remplacer la virgule par un autre séparateur, selon le rendu souhaité :
separateur = " ; "
Le résultat sera alors affiché de cette manière :
Marketing ; Commercial ; Informatique
Vous pouvez aussi utiliser un retour à la ligne. Dans ce cas, remplacez le séparateur par :
separateur = Chr(10)
Pensez à activer l’option Renvoyer à la ligne automatiquement dans la mise en forme de la cellule. Chaque choix apparaîtra alors sur une ligne différente.
Permettre la suppression d’un choix
Le code précédent ajoute les choix, mais il ne permet pas de retirer facilement une valeur déjà sélectionnée. Pour supprimer un choix, l’utilisateur doit effacer toute la cellule et recommencer.
Une version plus avancée peut fonctionner comme un interrupteur :
Voici une version complète avec cette logique :
Private Sub Worksheet_Change(ByVal Target As Range) Dim ancienneValeur As String Dim nouvelleValeur As String Dim separateur As String Dim elements As Variant Dim resultat As String Dim i As Long separateur = ", " If Target.CountLarge > 1 Then Exit Sub If Intersect(Target, Range("D2:D100")) Is Nothing Then Exit Sub On Error GoTo Sortie Application.EnableEvents = False nouvelleValeur = Target.Value Application.Undo ancienneValeur = Target.Value If ancienneValeur = "" Then Target.Value = nouvelleValeur GoTo Sortie End If elements = Split(ancienneValeur, separateur) For i = LBound(elements) To UBound(elements) If StrComp(Trim(elements(i)), nouvelleValeur, vbTextCompare) <> 0 Then If resultat = "" Then resultat = Trim(elements(i)) Else resultat = resultat & separateur & Trim(elements(i)) End If End If Next i If resultat = ancienneValeur Then Target.Value = ancienneValeur & separateur & nouvelleValeur Else Target.Value = resultat End IfSortie: Application.EnableEvents = TrueEnd Sub
Avec cette version, si la cellule contient “Marketing, Commercial” et que vous sélectionnez “Commercial”, cette valeur est retirée. Si vous sélectionnez “Informatique”, elle est ajoutée.
Cette approche est particulièrement agréable dans un formulaire : la liste déroulante devient presque une série de cases à cocher, tout en conservant une présentation compacte dans la feuille.
Adapter le code à votre fichier
Pour réutiliser ce système dans un autre classeur, trois éléments doivent généralement être adaptés :
Le nom de la liste utilisée dans la validation des données n’a pas besoin d’apparaître dans le code. VBA réagit simplement à toute modification effectuée dans la plage indiquée. Cela permet d’utiliser plusieurs listes différentes dans la même zone, à condition qu’elles reposent sur une validation des données de type Liste.
Si vous souhaitez gérer plusieurs plages, vous pouvez adapter la condition ainsi :
If Intersect(Target, Union(Range("D2:D100"), Range("F2:F100"))) Is Nothing Then Exit Sub
Le code s’appliquera alors aux colonnes D et F.
Ajouter une mise en forme agréable
Une liste à choix multiples est plus facile à utiliser si le contenu de la cellule reste lisible. Voici quelques réglages utiles :
Vous pouvez également afficher une instruction dans la cellule voisine, par exemple : “Sélectionnez plusieurs services si nécessaire”. Cela évite que l’utilisateur pense qu’il doit choisir une seule valeur.
Pour les tableaux professionnels, pensez aussi à figer la ligne d’en-tête et à appliquer un filtre automatique. Les choix multiples resteront lisibles, même si le tableau contient plusieurs centaines de lignes.
Enregistrer le fichier au bon format
Un point important, souvent oublié : un fichier contenant du VBA doit être enregistré au format Classeur Excel prenant en charge les macros (*.xlsm).
Si vous enregistrez le fichier en .xlsx, Excel supprimera le code VBA. Votre liste déroulante redeviendra alors une liste classique et vous risquez de vous demander où est passée la magie.
Lors de l’ouverture du fichier, Excel peut également afficher un avertissement de sécurité. Il faudra cliquer sur Activer le contenu pour autoriser l’exécution de la macro, à condition bien sûr que le fichier provienne d’une source fiable.
Les limites à connaître
Cette solution est très pratique, mais elle repose sur VBA. Elle présente donc quelques limites :
Cette dernière limite est importante pour l’analyse. Si vous devez compter précisément le nombre de personnes affectées à chaque service, il peut être préférable de stocker chaque choix dans une colonne séparée ou d’utiliser une structure de données plus normalisée.
En revanche, pour une fiche de suivi, une interface de saisie ou un tableau destiné à être lu par des humains, la liste déroulante à choix multiples est souvent un excellent compromis entre simplicité et efficacité.
Une alternative sans VBA
Si les macros sont interdites, plusieurs alternatives sont possibles. La plus simple consiste à créer une colonne par choix, avec une liste déroulante contenant “Oui” et “Non”. Vous pouvez ensuite regrouper les résultats avec une formule.
Dans Excel 365, la fonction JOINDRE.TEXTE permet par exemple de combiner plusieurs cellules :
=JOINDRE.TEXTE(", ";VRAI;SI(B2="Oui";"Marketing";"");SI(C2="Oui";"Commercial";"");SI(D2="Oui";"Informatique";""))
Cette méthode demande davantage de colonnes, mais elle reste compatible avec les environnements où VBA n’est pas disponible. Elle offre également l’avantage de conserver chaque choix dans une cellule distincte, ce qui facilite les analyses et les tableaux croisés dynamiques.
Un menu interactif, mais avec une vraie logique métier
La liste déroulante à choix multiples n’est pas seulement un effet visuel. Bien utilisée, elle améliore la qualité des données et simplifie la saisie pour les utilisateurs.
Avant de l’ajouter à votre fichier, posez-vous toutefois quelques questions :
Si la réponse est oui à la première question et que VBA est disponible, le code proposé vous permettra de créer rapidement un menu interactif et personnalisable. Vous pourrez ensuite adapter la plage, le séparateur et le comportement de suppression selon les besoins de votre tableau.
Excel ne propose peut-être pas encore cette fonctionnalité en standard, mais avec quelques lignes de VBA, votre simple liste déroulante prend une tout autre dimension.
