formateur informatique

Liste déroulante à choix multiples en VBA Excel

Accueil  >  Bureautique  >  Excel  >  Excel VBA  >  Liste déroulante à choix multiples en VBA Excel
Livres à télécharger


Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :


Inscription Newsletter    Abonner à Youtube    Vidéos astuces Instagram
Sujets que vous pourriez aussi aimer :


Listes déroulantes aux choix multiples

Cumuler plusieurs choix dans une même liste déroulante en VBA Excel est tout à fait possible.

Listes déroulantes VBA Excel aux choix cumulés

Sur l'exemple illustré par la capture, l'utilisateur doit construire deux équipes à l'aide de deux listes déroulantes. Il ajoute les membres un à un. Bien sûr, le code VBA Excel veille au grain. Il est bien évidemment interdit d'ajouter deux fois un même membre dans une même équipe. De plus et fort logiquement, un membre déjà intégré dans une équipe ne peut être choisi dans l'autre.

Classeur Excel à télécharger
Pour développer cette solution, nous suggérons d'appuyer l'étude sur un classeur Excel offrant déjà ces listes déroulantes. Les membres à choisir sont identifiés en colonne C. Deux listes déroulantes existent en effet en cellules respectives E4 et E8. Mais à ce stade, elles réagissent classiquement. Elles ne permettent pas encore de cumuler les choix. Elles remplacent un membre par un autre.

Code VBA aux choix dans les listes
Nous devons construire un code VBA capable de se déclencher dès qu'une valeur est choisie dans l'une ou l'autre liste déroulante. Pour cela et nous le savons, nous devons créer la procédure événementielle Worksheet_Change de manière à détecter qu'elles ont été les cellules impactées.
  • Réaliser le raccourci clavier ALT + F11 pour basculer dans l'éditeur VBA Excel,
  • Dans l'explorateur sur la gauche, double cliquer sur l'élément Feuil1(choixMultiples),
Ainsi, nous affichons sa feuille de code, vierge pour l'instant, au centre de l'écran.
  • En haut de cette feuille de code, déployer la liste déroulante de gauche,
  • Puis, choisir l'élément Worksheet,
Cette action a pour effet de créer la procédure événementielle Worksheet_SelectionChange. Ce n'est pas celle qui nous intéresse. Le code VBA ne doit pas se déclencher au changement de sélection, mais au changement de valeur.
  • Déployer alors la liste déroulante de droite,
  • Dans les propositions, choisir l'événement Change,
Déclencher un code VBA au changement de valeur dans les cellules de la feuille Excel

Cette fois, nous créons la procédure Worksheet_Change. C'est bien celle qui nous intéresse. Donc, la précédente peut être effacée.
  • Dans les bornes de la procédure, ajouter les déclarations de variables suivantes :
Private Sub Worksheet_Change(ByValTarget As Range)
Dim valeurAvt As String: Dim valeurAps As String

End Sub


Il s'agit de deux chaînes de texte (As String). Leur but est de comparer la cellule impactée avant et après modification pour pouvoir réaliser le cumul. Nous allons très vite le comprendre.

Vérifier les cellules modifiées
Pour optimiser les ressources, nous ne devons déclencher ce code VBA que lorsque l'une des deux cellules (E4 ou E8) a été modifiée.
  • Pour cela, créer cette instruction conditionnelle à la suite du code VBA :
...
If Target.Address = "$E$4" Or Target.Address = "$E$8" Then

End If
...


L'objet Target passé en paramètre de la procédure représente la cellule modifiée. Grâce à sa propriété Address, nous vérifions bien qu'il s'agit de la cellule E4 ou (Or) de la cellule E8, soit de l'une ou l'autre liste déroulante.

Valeurs avant et après modification
C'est maintenant que nous devons réceptionner les valeurs contenues dans la cellule impactée, avant et après modification.
  • Dans l'instruction conditionnelle, ajouter les lignes VBA suivantes :
...
valeurAps = Target.Value
Application.EnableEvents = False
Application.Undo
valeurAvt = Target.Value
...


Dans la variable valeurAps, nous prélevons le choix de l'utilisateur. Celui-ci se cumulera aux précédents grâce au code qui va suivre. Ensuite, nous coupons le déclenchement des événements. En effet, maintenant que le nouveau cumul est stocké en variable, nous annulons l'action de l'utilisateur (Undo). Ce changement ne déclenche temporairement plus ce code VBA. Nous retrouvons donc la cellule dans son état (cumul) précédent. Nous prélevons les valeurs qu'elle portait dans la variable valeurAvt cette fois. C'est ainsi que nous allons pouvoir établir les comparaisons.

Tester si le choix avait déjà été fait
Maintenant, nous devons nous assurer que le membre choisi par l'utilisateur n'avait pas déjà été sélectionné dans l'une ou l'autre liste déroulante. Pour cela, il faut rechercher la valeur choisie dans la chaîne cumulée précédente.
  • A la suite dans l'instruction conditionnelle, ajouter le double test suivant :
...
If InStr(1, [E4].Value, valeurAps) = 0 And InStr(1, [E8].Value, valeurAps) = 0 Then
Target.Value = valeurAvt & ", " & valeurAps
If Left(Target.Value, 2) = ", " Then Target.Value = Mid(Target.Value,2)
End If
...


La fonction InStr permet de trouver l'occurrence de la valeur cherchée (Le choix utilisateur valeurAps) dans une chaîne (Le cumul précédent E4 ou E8). Si le choix de l'utilisateur n'est pas trouvé (=0) dans les valeurs cumulées, alors le choix est assemblé avec les autres, moyennant une virgule de séparation suivie d'un espace (& ", "). En revanche, lorsqu'il s'agit du premier choix, la variable valeurAvt est vide, donc la virgule et son espace subsistent en valeur résiduelle en préfixe de la chaîne. C'est pourquoi nous testons si elle commence par cette succession de deux caractères grâce à la fonction Left (Left(Target.Value, 2) =", "). Si la réponse est positive, nous les éliminons en prélevant deux caractères plus loin, grâce à la fonction Mid.

Pour finir, il ne faut pas oublier de remettre en marche l'exécution des gestionnaires d'événements, sans quoi, les prochains cumuls ne pourront se faire puisque les listes déroulantes seront incapables de réagir. Pour ce cela, il suffit d'inverser la valeur de la propriété que nous avons réglée en début de code.
  • A la toute fin du code, après le dernier End If, ajouter l'instruction VBA suivante :
...
End If

Application.EnableEvents = True
End Sub
...


Cumuler les choix
Il est temps de tester ce code VBA.
  • Enregistrer les modifications (CTRL + S) et basculer sur la feuille Excel (ALT + Tab),
  • Avec la première liste déroulante en E4, réaliser un premier choix,
Le membre est parfaitement ajouté dans la cellule. Si vous réitérez ce même choix, vous constatez que la transaction est refusée. En conséquence, le membre n'est pas dupliqué. Si vous réalisez des choix différents, ils sont tous ajoutés les uns à la suite des autres dans la cellule de la liste déroulante.

Cumuler les choix sans doublons avec des listes déroulantes VBA Excel

Si vous choisissez un membre déjà pris, avec la seconde liste déroulante, le choix est refusé. En revanche, si vous cumulez les demandes sur des membres qui ne sont pris ni dans la première zone, ni dans la seconde, les choix multiples se réalisent.

 
Sur Facebook
Sur Youtube
Les livres
Contact
Mentions légales



Abonnement à la chaîne Youtube
Partager la formation
Partager sur Facebook
Partager sur Twitter
Partager sur LinkedIn