Liste déroulante à sélection multiples

Résolu
PaulCharente Messages postés 9 Statut Membre -  
PaulCharente Messages postés 9 Statut Membre -
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/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.

4 réponses

  1. cs_Le Pivert Messages postés 8437 Statut Contributeur 730
     
    Bonjour,

    un exemple:

    https://www.cjoint.com/c/IKsnWdZLdxQ

    1
    1. PaulCharente Messages postés 9 Statut Membre
       
      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
      0
  2. via55 Messages postés 14393 Date d'inscription   Statut Membre Dernière intervention   2 759
     
    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
    1
    1. PaulCharente Messages postés 9 Statut Membre
       
      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!
      ^^
      0
  3. via55 Messages postés 14393 Date d'inscription   Statut Membre Dernière intervention   2 759
     
    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
    1
    1. PaulCharente Messages postés 9 Statut Membre
       
      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
      0
  4. PaulCharente Messages postés 9 Statut Membre
     
    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
    0