Liste à choix multiple

Bonjour,

Je viens vous soumettre un problème que j'ai dans un long tableau avec ma colonne à "liste à choix multiple". Voilà :
Dans un fichier excel 2007, où j'ai déjà beaucoup de lignes (3044) et qui va être ré-alimenté régulièrement (4 ou 5 fois par mois), j'ai une colonne dans laquelle je dois avoir le choix de sélectionner plusieurs options dans une liste déroulante à choix multiple. J'ai suivi les instructions données par pijaku sur un autre post (ici = https://forums.commentcamarche.net/forum/affich-19616792-liste-deroulante-a-choix-multiple-excel-2007 mais ça ne fonctionne pas correctement : quand je double-clique sur une cellule de la colonne en question, ça m'ouvre bien ma liste à choix multiple sur laquelle je peux sélectionner mes différents choix, mais quand je clique sur valider, au lieu de mettre mes choix sélectionnés dans la cellule où j'ai double-cliqué, ça me ramène à la dernière cellule que j'ai indiqué dans mes codes VBA, à savoir O10000 (lettre O suivi de 10000) sans rajouter mes choix sélectionnés dans aucune des 2 cellules (ni dans celle où j'ai double-cliqué, ni dans la O10000).
(J'ai limité à 10000, mais en réalité, je veux pouvoir avoir la liste de choix utilisable dans chaque cellule de la colonne O (à part la 1° qui correspond au titre de ma colonne. Je ne connais pas vraiment le langage VBA, j'ai juste utilisé les infos du post indiqué ci-dessus)

Voici ce que j'ai mis :

Dans « userForm1 » =
-------------------------------------------------------------------------
Option Explicit

Private Sub CommandButton1_Click()
Dim i As Byte
Dim ValeurARetourner As String

For i = 0 To ListBox1.ListCount - 1
If ListBox1.Selected(i) = True Then
ValeurARetourner = ValeurARetourner & ListBox1.List(i) & " & "
End If
Next i
With Sheets("Listing affaires")
.Range("O2") = Left(ValeurARetourner, Len(ValeurARetourner) - 3)
.Range("O10000").Activate
End With
UserForm1.Hide
Unload UserForm1
End Sub

Private Sub ListBox1_Click()

End Sub

Private Sub UserForm_Initialize()
Dim i As Integer, Derlig As Integer
ListBox1.Clear

Derlig = Sheets("Listing affaires").Cells(65536, 27).End(xlUp).Row
For i = 1 To Derlig
ListBox1.AddItem Cells(i, 27).Value
Next i
For i = 0 To ListBox1.ListCount - 1
If ListBox1.Selected(i) = True Then
ListBox1.Selected(i) = False
End If
Next i
End Sub

-------------------------------------------------------------------------

Et dans worksheet
-------------------------------------------------------------------------
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Intersect(Target, Range("O2:O10000")) Is Nothing Then
Exit Sub
Else: Target.Value = ""
Load UserForm1
UserForm1.Show
End If
End Sub
-------------------------------------------------------------------------

Je ne sais pas si je suis très claire, aussi, n'hésitez pas à me poser des questions.

1/ Est-ce que je me trompe en pensant que mes infos range ne sont pas correctes ?
2/ j'ai l'impression qu'il me manque des codes dans le worksheet au niveau du « End If » (avant ou après) ??

Précision = j'ai créé ma liste de choix dans une colonne (AA) éloignée des autres, mais sur la même feuille que là où doivent s'afficher mes choix (colonne O)
==> ce qui me fait penser que c'est peut-être pas une bonne idée si un jour on supprime ou rajoute une colonne dans le tableau

PS : Chez moi, j'ai excel 2013 mais au bureau, c'est excel 2007. Je sais que normalement, ça ne devrait pas être un souci (du moins j'espère) mais je préfère le préciser !!

Désolée d'être aussi longue, mais je suppose que c'est nécessaire pour que vous ayez le max d'info.
Et un grand merci d'avance pour votre aide ! ;-D

20 réponses

Résumé de la discussion

Le problème concerne une colonne d'un long tableau Excel contenant une liste à choix multiple, car les sélections via une UserForm ne s'insèrent pas dans la cellule visée. Pour gérer un décalage de colonne, la solution proposée utilise WorksheetFunction.Match pour obtenir le numéro de colonne à partir de l'en-tête Catégorie, puis adapte le code en conséquence. L'idée centrale est de remplacer une référence figée par une détection dynamique et de cibler la ligne courante où l'utilisateur double-clique, afin que les valeurs s'écrivent dans la cellule active. Des discussions évoquent aussi le placement de la liste sur une seconde feuille pour faciliter la maintenance et assurer une meilleure compatibilité entre Excel 2007 et 2013.

Bobot (l’IA à votre service)
  1. Bonjour,
    Merci pour l'information.
    Note: les codes proposés ont étés testé sur votre classeur est c'est tout non pour moi.
    Bonne fin de semaine.

    Salutations.
    Le Pingou
    0
    1. Bonjour,
      Pour prendre en compte un éventuel changement de la position de la colonne [Catégorie], utilisez cette procédure (la votre modifier)
      Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
      ' trouver le numéro de la colonne avec titre Catégorie
      nuco = WorksheetFunction.Match("catégorie", Rows(1), 0)
      ' code modifier pour tenir compte du n° de la colonne
      If Intersect(Target, Range(Cells(2, nuco), Cells(Rows.Count, nuco))) Is Nothing Then
          Exit Sub
      Else: Target.Value = ""
          Load UserForm1
          UserForm1.Show
      End If
      End Sub
      

      0
      1. Bonsoir Le Pingou,
        Désolée, reprise du boulot aujourd'hui. Un imprévu ce soir ne m'a pas permis de regarder vos commentaires et codes. Et demain, je rentrerai relativement tard, donc ce sera pour vendredi.
        Pour le code erroné avec le nom de la feuille "categorie", j'avais essayé mais ça n'avait pas marché sauf que je crois avoir oublié le "s" du pluriel. Je recommence le test dès que possible et vous tiens au courant...
        Merci pour tout.
        Bonne fin de semaine.
        cLulu
        0
    2. Bonjour,
      Je viens d'ouvrir votre dernier lien pour voir la version.
      Dans le la procédure du poste 26 il faut mettre le [s] à Catégorie car j'avais pris en compte le nom mentionné dans le début de votre message.

      0
      1. Bonjour,
        2/Pour info, ..... pense que non, mais à confirmer ?
        Réponse: en principe pas de souci. Contrôler qui peut modifier la liste [Catégorie] et s'il y a lieu de la protégée

        3/ j'imagine que si quelqu'un modifie la structure .............. autre solution sans repasser par VBA ???
        Réponse : il faut adapter la procédure en travaillant par exemple avec le titre de la colonne ou mieux avec une plage nommée. Si vraiment nécessaire alors protéger la structure de la feuille... !

        Mon message 26 se rapporte à votre fichier d'origine.

        0
        1. Sur le mien
          https://www.cjoint.com/c/EGowkRp7b0z

          Pas de souci. Réponse quand vous pouvez. Merci

          -------------------------------------

          Par contre, je reviens sur des questions précédentes :

          2/Pour info, je ne sais pas si c'est important, mais c'est un fichier qui sera partagé entre plusieurs personnes sur un réseau, est-ce un souci ? ==> je pense que non, mais à confirmer ?

          3/ j'imagine que si quelqu'un modifie la structure du fichier (rajoute ou supprime une colonne, une feuille, etc...) ça va créer un bug ? ==> Je répond moi-même : oui, si on rajoute une colonne avant celle où était destiné la liste de choix multiple, elle se décale vers la droite. Donc, il faut donc réajuster dans VBA. A moins qu'il y ait une autre solution sans repasser par VBA ???

          cLulu
          0
          1. Bonsoir,
            Vite avant le petit sommeil.
            Votre code corrigé, je pense que c'est le nom de la feuille qui est faux (note dans le code)
            Private Sub UserForm_Initialize()
            Dim i As Integer, Derlig As Integer
            ListBox1.Clear
            ' nom de la feuille est Categorie  ...sans le S
            Derlig = Sheets("Categorie").Cells(Rows.Count, 1).End(xlUp).Row
                For i = 1 To Derlig
                ' il faut faire référence à la bonne feuille
                    ListBox1.AddItem Sheets("Categorie").Cells(i, 1).Value
                Next i
                For i = 0 To ListBox1.ListCount - 1
                    If ListBox1.Selected(i) = True Then
                        ListBox1.Selected(i) = False
                    End If
                Next i
            End Sub.
            

            Bonne nuit.
            0
            1. Bonsoir Le Pingou,

              Merci pour vos infos. J'ai fait la modif pour le choix multiple et ça marche impec ! ;-D
              D'autre part, je pense qu'effectivement faire la liste de choix multiple sur une 2° feuille, ce sera + pratique en effet, surtout si on doit rajouter ou modifier des choix. Je vais essayer de le faire.

              Concernant les désagréments, vous n'y êtes pour rien et finalement, les fichiers que Maurice a fait sont intéressants, mais ce qui est pénible, c'est de devoir passer du temps à chercher où il a apporté des modifs et ensuite de chercher à comprendre pourquoi. Il semble être très doué pour le VBA, mais ferait un très mauvais professeur à moins d'avoir le temps de chercher...

              Je reviens avec quelques questions concernant des codes...

              Merci

              clulu
              0
              1. Bonjour,
                Merci, c'est avec plaisir que j'y répondrai.
                Salutations.
                Le Pingou
                0
              2. Re-
                Comme dit ci-dessus, j'ai essayé de transférer ma liste de choix multiple dans une 2° feuille que j'ai nommé Categorie. Ma liste se trouve dans la 1° colonne à partir de la 2° cellule.
                Voici les codes que j'ai repris pour le UserForm =

                ------------------------------------------------------
                Option Explicit
                Dim Lig As Long
                Dim Col As Long

                Private Sub CommandButton1_Click()
                Dim i As Long, adr
                Dim ValeurARetourner As String

                ' *** récupérer l'adresse de la cellule active
                adr = ActiveCell.Address

                For i = 0 To ListBox1.ListCount - 1
                If ListBox1.Selected(i) = True Then
                ValeurARetourner = ValeurARetourner & ListBox1.List(i) & " & "

                End If
                Next i
                With Sheets("Listing affaires")

                ' *** insérer le choix dans la cellule concernée/active
                Range(adr) = Left(ValeurARetourner, Len(ValeurARetourner) - 3)
                End With

                UserForm1.Hide
                Unload UserForm1
                End Sub

                Private Sub ListBox1_Click()

                End Sub

                Private Sub UserForm_Initialize()
                Dim i As Integer, Derlig As Integer
                ListBox1.Clear

                Derlig = Sheets("Categories").Cells(65536, 1).End(xlUp).Row
                For i = 1 To Derlig
                ListBox1.AddItem Cells(i, 1).Value
                Next i
                For i = 0 To ListBox1.ListCount - 1
                If ListBox1.Selected(i) = True Then
                ListBox1.Selected(i) = False
                End If
                Next i
                End Sub

                ------------------------------------------------------

                Quand je teste, ça m'ouvre la liste box mais sans ma liste de choix (avec Nbre en tête de liste et rien dessous ???) et me renvoi une erreur "code 5" et dans le débogage, ça me surligne la partie en gras soulignée ci-dessus.

                D'autre part, mais ça, c'est juste pour une question de lisibilité, j'ai essayé de remplacer les & qui se mettent entre 2 choix par / , mais ça ne marche pas. Est-ce possible ? Si c'est possible, tant mieux, mais je crains que non ? Me trompe-je ?
                0
              3. Bonsoir,
                Il se fait tard, pour demain.
                Pouvez-vous me préciser sur quel classeur vous êtes le votre ou celui du monsieur...?
                Salutations.
                Le Pingou
                0
            2. Bonjour

              voila une modife
              Faire Ctrl+k pour voir la liste et la modifier
              http://www.cjoint.com/c/EGnlVj2v7EM
              A+
              Maurice
              0
              1. Bonjour Maurice,

                Inutile de continuer à envoyer des fichiers avec des modifs sans me donner aucune explication. Visiblement, vous n'avez pas compris que le but d'un forum est d'expliquer les choses, pas de les faire vous-même. Je vous remercie pour vos fichiers, mais ne pouvant les exploiter moi-même, je préfère continuer avec des personnes qui m'expliqueront mes interrogations.
                Je vous remercie également pour vos efforts, mais comprenez que je n'ai pas le temps de décortiquer vos fichiers ligne par ligne et chercher ensuite les infos pour comprendre...

                PS : votre réponse "Faire Ctrl+k pour voir la liste et la modifier " ne fonctionne pas. De plus, j'avais trouvé la solution à ce problème (voir mon post du 12 juil. 2015 à 22:29).

                Cordialement.
                Lulu
                0
              2. Bonjour,
                J'ose espérer que vous avez constaté que votre classeur de départ et son code fonctionne avec les petites modifications.
                Concernant la liste de choix c'est bon sur la même feuille mais toujours préférable, pour le gestion/confort d'utilisation, de séparer les listes de la feuille qui contient le tableau principale.
                Désolé pour le désagrément.
                Salutations.
                Le Pingou
                0
            3. Bonsoir Clulu34,
              En consultant votre classeur d'origine j'ai trouvez que votre code était bon sauf petite modification.
              Je l'ai corrigé (voir petite note directement dans la procédure) et il semble que tout est OK
              Votre classeur : http://www.cjoint.com/c/EGmvTQzTxgY

              Au cas où vor le faite savoir.

              Salutations.
              Le Pingou
              0
              1. Bonjour Clulu34,
                Sur mon message de hier, j'ai omis de prendre en compte votre besoin de sélectionner plus d'un choix pour la même cellule, il vous suffit de supprimer cette ligne dans votre code ü !
                Exit For ' *** sortir de la boucle dès valeur trouvée
                
                Salutations.
                Le Pingou
                0
            4. Bonjour,
              Je vais consulter les 3 classeurs en tenant compte de votre demande et vous renseignerez demain en fin de journée.

              0
              1. Bonsoir,
                A force de chercher, chercher, et... chercher encore, j'ai fini par retrouver l'onglet correspondant à la liste de choix. (Alors que quelques mots d'explications m'auraient permis de gagner des heures et des heures...)

                Bref, pour ceux que ça pourrait intéresser :
                En fait, dans les propriétés correspondant à la l'onglet "Liste" (Feuil2) Maurice avait sélectionné "2 - xSheetVeryHidden" dans la partie "visible".

                Pas bien compliqué quand on sait ce qu'on cherche, n'est-ce pas... ;-D
                0
                1. Bonjour clulu34,
                  Excusez l'intrusion, c'est effectivement désolant ce manque de réponse et de plus il m'est impossible d'accéder au fichier ... c'est dur de cette manière...

                  0
                  1. Bonjour Pingou,

                    Pas de souci, il n'y a pas d'intrusion, je cherche effectivement de l'aide.

                    Pour accéder au fichier que Maurice transmet, il faut sélectionner la ligne d'adresse qu'il indique et avec un clic droit, on accède à la page pour pouvoir récupérer le fichier (ou faire un copier/coller dans la barre d'adresse.
                    http://www.cjoint.com/c/EGls4VFQFzk
                    Mais dans le fichier joint, il n'y a aucune explication sur les modifs apportées par rapport à mon fichier d'origine. J'avais créée des codes VBA qui ont été supprimés (alors que j'avais suivi des instructions données sur un autre post comme indiqué au début). Je suppose qu'ils étaient inutiles, puisque ça marche bien dans cette nouvelle version, mais j'aurai bien aimé comprendre pourquoi afin de ne pas reproduire ce genre d'erreur. Sauf que sans explications, c'est compliqué. Tout comme l'onglet "disparu" avec la liste des choix... j'essaye de chercher des infos sur divers sites expliquant le VBA, mais je dois pas chercher correctement, car je ne trouve pas... C'est dommage, car du coup, je ne vais pas pouvoir utiliser ce fichier puisque je ne peux pas modifier la liste de choix.
                    Si quelqu'un peut me donner quelques explications/pistes, ce serait sympa.
                    0
                2. Bonjour

                  Voila les modifes demander
                  http://www.cjoint.com/c/EGls4VFQFzk

                  sinon if faut que tu cherche un peux
                  A+
                  Maurice
                  0
                  1. Bonjour Maurice
                    Merci pour les modifs, c'est nickel MAIS, si je demande des explications c'est justement pour chercher, comprendre et pouvoir faire moi-même. D'ailleurs, j'ai bien fait le fichier de base en suivant des instructions que j'ai essayé d'adapter à mon cas.
                    Je le répète, je suis complètement novice en VBA.

                    Dans cette nouvelle version que je viens de récupérer, je ne trouve pas l'endroit où se trouve la liste des choix de base. Hors, je dois y avoir accès pour pouvoir modifier/rajouter des choix. Mais ici, il n'y a pas d'onglet caché (ou alors vraiment très bien caché !! ;-) ) alors que sur la version précédente, j'avais trouvé le nouvel onglet avec la liste.

                    Merci de m'en dire un minimum pour que je comprenne !!
                    Je pensais que le but du forum était justement d'avoir des explications et de l'aide pour pouvoir faire soi-même... Visiblement, je me suis trompée. Désolée.

                    Bon dimanche, et encore merci.
                    Je pars décortiquer comme je peux cette nouvelle version ;-)
                    0
                3. Bonjour,

                  Y'aurait-il quelqu'un qui puisse m'aider, Maurice n'ayant fait qu'un passage éclair sur ce forum et n'ayant pas répondu à mes diverses questions. Je vous en remercie d'avance. Donc je récapitule les questions :

                  1/ Je pense que mes références de cellules sont incorrectes, et d'ailleurs, je voudrais que ça marche dans toute la colonne, et non pas que dans celles que j'avais mise (O2 à O1000), mais je ne sais pas comment / quel code VBA pour que ça marche dans chaque cellule de la colonne O ???

                  2/Pour info, je ne sais pas si c'est important, mais c'est un fichier qui sera partagé entre plusieurs personnes sur un réseau !

                  3/ j'imagine que si quelqu'un modifie la structure du fichier (rajoute ou supprime une colonne, une feuille, etc...) ça va créer un bug ?

                  4/ Suite aux modifs de Maurice :
                  Je ne suis pas contre le nouvel onglet pour la liste des choix, mais est-ce une obligation (mais si cela doit simplifier le problème, pas de souci) ??

                  Je vous en remercie d'avance.

                  Bon WE
                  0
                  1. Bonjour
                    modification de la Liste
                    http://www.cjoint.com/c/EGjtYRy5Uz2
                    A+
                    Maurice
                    0
                    1. Merci Maurice,
                      Pourriez-vous me donner quelques explications. Je ne suis pas contre le nouvel onglet pour la liste des choix, mais est-ce une obligation ??
                      D'autre part, la liste de choix s'ouvre bien, mais même si je sélectionne plusieurs éléments dans la dite liste à choix multiple, seulement le dernier choix cliqué est pris en compte, ce qui n'est donc pas correct selon moi. Je dois pouvoir avoir plusieurs choix possibles et qui s'affiche dans la cellule.
                      Merci pour les modifs, mais surtout merci de m'expliquer afin que je puisse comprendre et progresser en VBA.
                      0
                  2. Bonsoir,
                    Voici le fichier original avec les codes VBA que j'ai créés. La liste de choix s'ouvre bien, mais quand je sélectionne les infos voulues, elles n'apparaissent pas dans la cellule où j'ai double-cliqué, ni dans celle où j'atterri quand je valide ??? Je pense que mes références de cellules sont incorrectes, et d'ailleurs, je voudrais que ça marche dans toute la colonne, et non pas que dans celles que j'avais mise (O2 à O1000).

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

                    Pour info, je ne sais pas si c'est important, mais c'est un fichier qui sera partagé entre plusieurs personnes sur un réseau !

                    Et enfin, j'imagine que si quelqu'un modifie la structure du fichier (rajoute ou supprime une colonne, une feuille, etc...) ça va créer un bug ?

                    Bonne soirée et merci de votre aide.
                    0
                    1. Bonjour,
                      Etant donné que c'est le code qui fait problème, alors sans ce dernier ce n'est pas possible.
                      Pour l'envoi du classeur, faite comme suit : créer une copie puis sur la feuille vous effacez les données confidentielles.... !
                      0
                      1. Bonjour,
                        Bon, j'ai essayé de changer des codes, notamment, remplacer "range" par "colomn ("o") dans Worsheet, et idem dans le UserForm1, mais ça ne marchait plus. J'ai donc remis comme avant, mais maintenant j'ai la 1° ligne qui est surligné en fluo jaune dans worksheet quand je teste ???

                        Personne n'a une idée pour m'aider à avancer ?
                        Merci
                        0
                        1. Bonjour,
                          Pouvez-vous mettre le classeur sur https://www.cjoint.com/ et poster le lien ?

                          0
                          1. Bonsoir Pingou.

                            Je viens de mettre un extrait du tableau vide ici :
                            https://www.cjoint.com/c/EGiv3cKXy7z

                            Ce n'est pas le tableau original qui est verrouillé par mot de passe et qui serait bien trop lourds je crois. Il n'y a donc pas les codes VBA dans celui-ci, et je me rends compte que je n'ai pas nommé l'onglet comme dans mon vrai fichier (indiqué dans les codes VBA que j'ai mis sur le forum).

                            Merci pour votre aide
                            0