Liste déroulante à sélection multiples [Résolu]

Signaler
Messages postés
8
Date d'inscription
lundi 18 novembre 2019
Statut
Membre
Dernière intervention
21 novembre 2019
-
PaulCharente
Messages postés
8
Date d'inscription
lundi 18 novembre 2019
Statut
Membre
Dernière intervention
21 novembre 2019
-
Bonjour,

Je suis chargée pour mon travail de réaliser un fichier excel référençant des comptes rendu de réunion.

Je souhaite avoir dans une colonne "thèmes" une sélection déroulante à choix multiples me permettant de renseigner pour chaque compte rendu (ligne par ligne) les différents thèmes abordés et qu'ils s'affichent dans la cellule séparés par une virgule. (Exemple : contrat X, réunion Y, échéance Z, Travaux H, Problème K...)

J'ai cherché plusieurs heures comment faire et le mieux que j'ai trouvé est une extension à installer (kutools, https://www.extendoffice.com/fr/documents/excel/3922-excel-drop-down-list-with-checkboxes.html). Mais je ne peux pas l'installer sur mon ordinateur pro. Et pour l'avoir testé, passer d'un ordinateur avec kutools (mon ordi perso) vers un ordi sans (mon ordi pro) annule la fonctionnalité créée.

Je sais créer une liste déroulante (via validation de données), j'aimerais savoir comment en faire une liste à choix multiples et comment afficher les choix sélectionnés dans une cellule avec une virgule comme séparateur.

Est ce que quelqu'un sait comment faire et l'expliquer simplement ?

Merci par avance.

8 réponses

Messages postés
6435
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
16 décembre 2019
423
PaulCharente
Messages postés
8
Date d'inscription
lundi 18 novembre 2019
Statut
Membre
Dernière intervention
21 novembre 2019

Merci beaucoup cs_Le Pivert. C'est quasiment ce que je recherche.

Toutefois comment puis-je faire pour que la listebox n'apparaisse que lorsque que l'on clique sur la cellule à renseigner (sur votre exemple : F4) en format d'une liste déroulante (type combobox)?
Sachant que je dois en plus pouvoir reproduire cette formule (ou macro) sur de très nombreuses lignes (pare exemple toute la colonne F) avec à chaque fois la possibilité de faire de nouveaux choix.

Cordialement
Messages postés
11475
Date d'inscription
mercredi 16 janvier 2013
Statut
Membre
Dernière intervention
16 décembre 2019
1553
Bonjour

En partant du fichier envoyé par le Pivert (que je salue au passage), en feuille 2 une combox qui s'affiche à la sélection d'une cellule dans la colonne déterminée :
https://www.cjoint.com/c/IKsvsPl00ev

Cdlmnt
Via
PaulCharente
Messages postés
8
Date d'inscription
lundi 18 novembre 2019
Statut
Membre
Dernière intervention
21 novembre 2019

Wooooaaaawwww!

C'est exactement ça!

Et merci pour les notes dans le code pour que je puisse l'intégrer facilement avec mes petites mains pleines de gros doigts. Des jours que je cherche une solution par moi même sans y arriver.


Une grosse épine du pieds en moins!
^^
Messages postés
11475
Date d'inscription
mercredi 16 janvier 2013
Statut
Membre
Dernière intervention
16 décembre 2019
1553
Bonjour

Il faut mettre les 2 premiers code dans la même sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range) ' A la selection d'une cellule de la feuille
If Not Intersect([G2:G1000], Target) Is Nothing And Target.Count = 1 Then ' zone de saisie possible A MODIFIER si nécessaire, si selection d'une celle dans cette zone alors ...
Me.ListBox1.ListIndex = -1 'RAZ Listbox
Me.ListBox1.ListFillRange = "THEMES!A2:A14" 'Alimentation de la listbox A MODIFIER si necessaire
Me.ListBox1.Height = 176 'hauteur listbox
Me.ListBox1.Width = 105 'largeur listbox
Me.ListBox1.Top = Target.Top 'position haut listbox = haut cellule
Me.ListBox1.Left = Target.Left + Target.Width ' position gauche listbox= position gauche cellule+largeur cellule => revient à positionner à droite de la cellule
Me.ListBox1.Visible = True 'rend visible la listbox
Else
Me.ListBox1.Visible = False 'si saisie dans une zone différente masque la listbox
End If
If Not Intersect([H2:H1000], Target) Is Nothing And Target.Count = 1 Then ' zone de saisie possible A MODIFIER si nécessaire, si selection d'une celle dans cette zone alors ...
Me.ListBox2.ListIndex = -1 'RAZ Listbox
Me.ListBox2.ListFillRange = "THEMES!C2:C27" 'Alimentation de la listbox A MODIFIER si necessaire
Me.ListBox2.Height = 360 'hauteur listbox
Me.ListBox2.Width = 200 'largeur listbox
Me.ListBox2.Top = Target.Top 'position haut listbox = haut cellule
Me.ListBox2.Left = Target.Left + Target.Width ' position gauche listbox= position gauche cellule+largeur cellule => revient à positionner à droite de la cellule
Me.ListBox2.Visible = True 'rend visible la listbox
Else
Me.ListBox2.Visible = False 'si saisie dans une zone différente masque la listbox
End If
End Sub

2) tes listes de choix étant en colonnes A et C je ne vois pas comment les colonnes après pourrait avoir une incidence (sauf formule en A ou C u faisant appel
Quoiqu'il en soit pour retourner dans une cellule de O la liste des jours de la période il faut créer une fonction personnalisée que tu mets dans un module de l'éditeur VBA
Function periode_jours(dateA As Range, dateB As Range)
Application.Volatile
For n = dateA To dateB + 1
js = Application.WorksheetFunction.Choose(Application.WorksheetFunction.Weekday(n, 2), "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi", "dimanche")
aff = aff & js & ", "
Next
periode_jours = Left(aff, Len(aff) - 2)
End Function


Tu utilise ensuite la fonction comme toute fonction Excel selon la syntaxe :
=periode_jours(cellule date début;cellule date fin
par ex =periode_jours(L2;M2)

Cdlmnt
Via
PaulCharente
Messages postés
8
Date d'inscription
lundi 18 novembre 2019
Statut
Membre
Dernière intervention
21 novembre 2019

Je te remercie via55. C'est vraiment super.
Et vu que tu explique bien comment faire en plus de donner la solution je progresse en même temps (un peu).

Je teste tous ça dès demain matin.

Bonne soirée.
Paul
Messages postés
8
Date d'inscription
lundi 18 novembre 2019
Statut
Membre
Dernière intervention
21 novembre 2019

Bonjour,

merci encore via55. j'ai pu adapter ta macro sur mon fichier pro! ^^

ça marche tellement bien que j'ai voulu faire la même chose dans une autre colonne sur la même page...
Et depuis je m'arrache les cheveux car apparemment on ne peut pas avoir 2 "worksheet_SelectionChange" sur la même page, il faut les compiler. Chose que je ne sais pas faire et dont je ne trouve pas d'explication sur internet.
Je n'avais pas connaissance de cette restriction sinon j'aurais directement demandé l'explication pour comprendre et pouvoir le faire moi-même.

Le message d'erreur affiché est :
Erreur de compilation:
Nom ambigu détecté: Worksheet_SelectionChange


Voici le code de la 1ère macro adapté à mon fichier (qui fonctionne quand utilisé seul) :
Private Sub Worksheet_SelectionChange(ByVal Target As Range) ' A la selection d'une cellule de la feuille
If Not Intersect([G2:G1000], Target) Is Nothing And Target.Count = 1 Then ' zone de saisie possible A MODIFIER si nécessaire, si selection d'une celle dans cette zone alors ...
Me.ListBox1.ListIndex = -1 'RAZ Listbox
Me.ListBox1.ListFillRange = "THEMES!A2:A14" 'Alimentation de la listbox A MODIFIER si necessaire
Me.ListBox1.Height = 176 'hauteur listbox
Me.ListBox1.Width = 105 'largeur listbox
Me.ListBox1.Top = Target.Top 'position haut listbox = haut cellule
Me.ListBox1.Left = Target.Left + Target.Width ' position gauche listbox= position gauche cellule+largeur cellule => revient à positionner à droite de la cellule
Me.ListBox1.Visible = True 'rend visible la listbox
Else
Me.ListBox1.Visible = False 'si saisie dans une zone différente masque la listbox
End If
End Sub

Private Sub Listbox1_Change() ' à tout changement dans la listbox
Dim i As Byte
Dim chaine As String
'boucle sur les éléments de la listbox
For i = 0 To ListBox1.ListCount - 1
If ListBox1.Selected(i) = True Then
chaine = chaine & ListBox1.List(i) & ", "
End If
Next i
ActiveCell.Value = Left(chaine, Len(chaine) - 2) 'affichage dans la cellule de la chaine concaténée moins la dernière virgule et le dernier espace

End Sub

Private Sub Listbox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) ' lorsque une touche est pressée quand la listbox est visible
If KeyCode = 13 Then ActiveCell.Offset(1).Select ' si touche Entrée déplacement à la cellule en dessous
End Sub



Et voici l'autre code (qui fonctionne seul également) :
Private Sub Worksheet_SelectionChange(ByVal Target As Range) ' A la selection d'une cellule de la feuille
If Not Intersect([H2:H1000], Target) Is Nothing And Target.Count = 1 Then ' zone de saisie possible A MODIFIER si nécessaire, si selection d'une celle dans cette zone alors ...
Me.ListBox2.ListIndex = -1 'RAZ Listbox
Me.ListBox2.ListFillRange = "THEMES!C2:C27" 'Alimentation de la listbox A MODIFIER si necessaire
Me.ListBox2.Height = 360 'hauteur listbox
Me.ListBox2.Width = 200 'largeur listbox
Me.ListBox2.Top = Target.Top 'position haut listbox = haut cellule
Me.ListBox2.Left = Target.Left + Target.Width ' position gauche listbox= position gauche cellule+largeur cellule => revient à positionner à droite de la cellule
Me.ListBox2.Visible = True 'rend visible la listbox
Else
Me.ListBox2.Visible = False 'si saisie dans une zone différente masque la listbox
End If
End Sub

Private Sub Listbox2_Change() ' à tout changement dans la listbox
Dim i As Byte
Dim chaine As String
'boucle sur les éléments de la listbox
For i = 0 To ListBox2.ListCount - 1
If ListBox2.Selected(i) = True Then
chaine = chaine & ListBox2.List(i) & ", "
End If
Next i
ActiveCell.Value = Left(chaine, Len(chaine) - 2) 'affichage dans la cellule de la chaine concaténée moins la dernière virgule et le dernier espace

End Sub

Private Sub Listbox2_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) ' lorsque une touche est pressée quand la listbox est visible
If KeyCode = 13 Then ActiveCell.Offset(1).Select ' si touche Entrée déplacement à la cellule en dessous
End Sub


Les deux mis ensembles à la suite me donnent le message d'erreur écris plus haut.
D'après ce que j'ai lu sur différent forum, on ne peut pas mettre 2 macro worksheet_selectionchange et il faut donc les compiler.

Merci par avance de votre aide, c'est vraiment apprécié. :-)

######

Je dois également trouver une autre formule ou macro, je vous en parle ici dès fois que la réalisation de celle-ci influe mes listes à choix multiple (si pas d’impact je ferais un post dédier) :

J'ai une colonne L avec un groupe date heure (représente le début), une colonne M avec un autre groupe date heure (représente la fin), je voudrais dans une colonne O renseigner automatiquement les jours de la semaine concernés sur la période (la différence entre les dates L et M sont comprise entre 1 et 4 jours généralement) sous le format "lundi, mardi, mercredi, jeudi, ...". C'est pour pouvoir à terme faire des statistiques de récurrence : exemple tel évènement arrive 8 fois sur 10 le mercredi.

Cordialement,
Paul