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 :

  • les noms peuvent être écrits différemment ;
  • les fautes de frappe deviennent fréquentes ;
  • les données sont moins faciles à filtrer ;
  • les utilisateurs ne savent pas toujours quelles valeurs sont autorisées.
  • 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 :

  • Autoriser : Liste ;
  • Source : la plage contenant les valeurs disponibles ;
  • puis de valider.
  • 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 :

  • Marketing
  • Commercial
  • Informatique
  • Ressources humaines
  • Direction
  • 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 :

  • si la valeur n’est pas encore présente, elle est ajoutée ;
  • si elle est déjà présente, elle est retirée.
  • 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 :

  • la plage surveillée, par exemple D2:D100 ;
  • le séparateur utilisé entre les valeurs ;
  • la feuille dans laquelle le code est installé.
  • 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 :

  • activez le renvoi automatique à la ligne ;
  • élargissez la colonne contenant les sélections ;
  • augmentez légèrement la hauteur des lignes ;
  • utilisez une couleur de fond légère pour identifier les cellules interactives ;
  • ajoutez un commentaire ou une note expliquant le fonctionnement.
  • 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 :

  • elle ne fonctionne pas dans Excel pour le Web de la même manière que dans Excel pour Windows ou Mac ;
  • les macros peuvent être bloquées par les paramètres de sécurité de l’entreprise ;
  • les utilisateurs doivent accepter l’exécution du code ;
  • les cellules contiennent une chaîne de texte, et non plusieurs valeurs indépendantes.
  • 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 :

  • les utilisateurs doivent-ils réellement choisir plusieurs valeurs ?
  • les sélections devront-elles être analysées séparément ?
  • le fichier sera-t-il utilisé dans Excel pour le Web ?
  • les macros sont-elles autorisées dans votre environnement ?
  • 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.