Liste déroulante à choix multiple Excel 2007 [Résolu/Fermé]

Signaler
Messages postés
51
Date d'inscription
samedi 2 août 2008
Statut
Membre
Dernière intervention
6 décembre 2010
-
 fval -
Bonjour,

Je suis un vraiment newbe d'Excel. Je dois préparer un masque de saisie.
Et il me serait très utile d'avoir une liste déroulante (ça j'ai fait avec "validation des données") ou l'on puisse choisir plusieurs modalités.
En fait, il s'agit de déplacement, genre: voiture, à pied, bus, etc. Et ces modes de transport peuvent se succéder.

Le top serait d'avoir l'ordre du choix mais si j'ai déjà un choix multiple, je serais comblé

Une idée ?

Merci d'avance

19 réponses

Messages postés
12184
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
31 juillet 2020
2 463
Et bien allons y.

I/ Création
1- Tu ouvres ton classeur,
2- Tapes ALT+F11 (ou Outils/Macros/Visual Basic Editor)
3- Insertion/UserForm
4- Adaptes en la forme à la taille désirée,
5- Sur la gauche de ton écran tu dois avoir une fenêtre "propriétés". Si ça n'est pas le cas, appuies sur F4. Dans cette fenêtre cherche la propriété "caption". Dans la cellule à côté change le UserForm1 par le titre que tu souhaites (ex : Ma Liste Multiple). !!! ATTENTION : ne change pas la propriété Name !!!!!
6- Clic sur ton UserForm. Normalement, une boîte à outils apparait. Non? et bien : Affichage/Boîte à Outils
7- Dans cette boîte à outils cherche (et trouve) le contrôle : "zone de liste". Clic dessus et va dessiner ta zone de liste dans ton UserForm
8- Toujours dans la boîte à outils cherche (et trouve) le contrôle : "Bouton de commande". Clic dessus et va dessiner ton boutondans ton UserForm.
9- Simple clic sur le bouton (dans le UserForm) et va changer la propriété (fenêtre propriétés... Mais si à gauche de l'écran, F4, tout ça...) "caption" remplacer CommandButton1 (ex : VALIDER). !!! ATTENTION : ne change pas la propriété Name !!!!! ;-) Tu t'y attendais? Non? Ah bon...
10- Tu peux également changer l'apparence de ton bouton en changeant les propriétés : BackColor, Font, ForeColor. Idem pour l'UserForm (simple clic dessus et hop hophop, tu as accès à ses propriétés)

II/ Les Codes VBA
Là ça devient sérieux, on arrête de bricoler!!
1- Double clic sur le bouton de commande dans ton UserForm. Une nouvelle fenêtre apparait avec dedans :
Private Sub CommandButton1_Click()

End Sub

2- Supprime ces deux lignes et à la place, copie / colle tout ce code :
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("Feuil1")
.Range("C4") = Left(ValeurARetourner, Len(ValeurARetourner) - 3)
.Range("C5").Activate
End With
UserForm1.Hide
Unload UserForm1
End Sub

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

Derlig = Sheets("Feuil1").Cells(65536, 9).End(xlUp).Row
    For i = 1 To Derlig
        ListBox1.AddItem Cells(i, 9).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

3- Les 9 dans les parties en gras dans le code ci dessus sont à adapter selon l'endroit ou tu as mis tes données de remplissage de ta liste. 9 = 9ème Colonne (Colonne I)
3 bis- Dans la ligne : Derlig = Sheets("Feuil1").Cells(65536, 9).End(xlUp).Row, "Feuil1" est le nom de la feuille ou se trouve la liste des données. A remplacer par le nom de votre feuille (entouré de "")
3 ter- "C4" dans : .Range("C4") = Left(ValeurARetourner, Len(ValeurARetourner) - 3) est la cellule dans laquelle vous voulez envoyer vos choix
.Range("C5").Activate à adapter également
With Sheets("Feuil1") Feuil1 à remplacer aussi...
4- Ferme Visual Basic Editor (fichier / fermer et retourner sous excel ou ALT+Q)
5- Clic droit sur l'onglet de la feuille concernée par le UserForm (feuille ou tu souhaites voir apparaitre le résultat) / Visualiser le code
Nouvelle fenêtre visual basic. Copie / colle y ce code :
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Target.Address = "$C$4" Then
    Target.Value = ""
    Load UserForm1
    UserForm1.Show
End If
End Sub

Ici "$C$4" est la cellule dans laquelle tu va à l'avenir double cliquer pour lancer le UserForm. A adpater donc...
6- Ferme à nouveau Visual Basic (Alt+Q) et teste en double cliquant sur C4 (ou ce que tu aurs bien voulu choisir).

J'ai fait de mon mieux pour que ces explications soient le plus claires possibles. En cas d'erreur, n'hésite pas à revenir ici.
13
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 57068 internautes nous ont dit merci ce mois-ci

Bonjour,

Je sais que j'arrive avec de nombreux mois de retard, mais si jamais quelqu'un peut m'aider... ?
Voilà mon problème :
J'apprends à créer des listes à choix multiples grace à votre tuto et merci pour tout.
Lorsque je crée le bouton de commande, il n'apparait pas (transparent) et lorsque j'ai terminé, même si ma liste a bien été créée, il n'y a pas le bouton de validation lorsque on a sélectionné.
Pouvez-vous m'aider ?

Merci d'avance
salut pijaku,

j'ai suivi tes instructions et j'arrive à avoir une fenêtre qui propose plusieurs en double clicant sur une cellule (ici C16)
J'aimerais savoir comment modifier le code ci dessous pour que je puisse avoir la même liste de choix en C17, C18 etc.. et cela sans limite (idéalement pour toute la colonne).

Voici le code actuellement utilisé pour l'UF :

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("Demande")
.Range("C16") = Left(ValeurARetourner, Len(ValeurARetourner) - 3)
.Range("C16").Activate

End With
UserForm1.Hide
Unload UserForm1
End Sub


Private Sub UserForm_Initialize()
Dim i As Integer, Derlig As Integer
ListBox1.Clear
With Sheets("Infos")
Derlig = .Cells(65536, 2).End(xlUp).Row
For i = 1 To Derlig
ListBox1.AddItem .Cells(i, 2).Value
Next i
End With
For i = 0 To ListBox1.ListCount - 1
If ListBox1.Selected(i) = True Then
ListBox1.Selected(i) = False
End If
Next i

End Sub
Messages postés
51
Date d'inscription
samedi 2 août 2008
Statut
Membre
Dernière intervention
6 décembre 2010
22
Bonjour,

J'ai rien sous la main, tout est au boulot. Mais concretement, ce que je veux c'est pour une même cellule avec une liste déroulante de modalité de réponse, la personne puisse choisir plusieurs modalité (un trajet ou on aurait utilisé la voiture et puis le tram, choisir voitur et tram, par exemple).

Je posterai un ex. demain

Merci pour la réponse
Messages postés
51
Date d'inscription
samedi 2 août 2008
Statut
Membre
Dernière intervention
6 décembre 2010
22
Merci pijaku,

J'ai essayé quelques fois sur mon fichier d'origine qui contient déjà pas mal de macros, qui ne sont pas de moi. Donc c'est peut être pour cela que ça ne fonctionne pas du tout comme je le souhaite.
Notamment:
- la liste est issue de la feuille de destination alors que les modalités de listes sont sur une feuille à part (pourtant j'ai bien respecté tes consignes).
- Il n'y a pas de sélection multiple comme dans ton exemple mais un seul item sélectionné.
- Le bouton validation ne faire rien. Il ne valide pas les réponses. On est obligé de fermer la userform

J'ai essayé sur un fichier à part, en mettant ma liste d'une part, la case de destination d'autre part, et je rencontre encore des problèmes:
- aucune modalité n'apparaît
- en appuyant sur valider, il me propose un débuggage sur la ligne en gras:
With Sheets("Lundi")
.Range("B4") = Left(ValeurARetourner, Len(ValeurARetourner) - 3)
.Range("B5").Activate

En revanche quand je fais cela sur la même page ça fonctionne (mise à part le choix multiple)

Qu'en dis tu ?
Messages postés
51
Date d'inscription
samedi 2 août 2008
Statut
Membre
Dernière intervention
6 décembre 2010
22
Voici le second fichier:
https://www.cjoint.com/?0kCrINae8RX
Messages postés
12184
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
31 juillet 2020
2 463
Salut,
J'ai fait une erreur et un oubli... Désolé.
1- l'oubli : Il faut changer la propriété MultiSelec de la listbox. Pour cela, va sous Visual Basic (ALT+F11 dans ton classeur), affiche ton userform (à gauche de l'écran : fenêtre projet/feuilles/double clic sur Userform1), sélectionne la listbox en cliquant dessus et dans la fenêtre propriétés, règle le Multiselec sur 1- fmMulitiSelecMulti
2- l'erreur : dans le code d'initialisation de l'userform :
Private Sub UserForm_Initialize()
Dim i As Integer, Derlig As Integer
ListBox1.Clear
Derlig = Sheets("Feuil1").Cells(65536, 9).End(xlUp).Row
    For i = 1 To Derlig
        ListBox1.AddItem Cells(i, 9).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

Les lignes en gras ne fonctionnent que si la liste est sur la même feuille... Donc à remplacer par :
Private Sub UserForm_Initialize()
Dim i As Integer, Derlig As Integer
ListBox1.Clear
With Sheets("Listes")
Derlig = .Cells(65536, 1).End(xlUp).Row
    For i = 1 To Derlig
        ListBox1.AddItem .Cells(i, 1).Value
    Next i
End With
    For i = 0 To ListBox1.ListCount - 1
        If ListBox1.Selected(i) = True Then
            ListBox1.Selected(i) = False
        End If
    Next i
    
End Sub
Messages postés
12184
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
31 juillet 2020
2 463
Bonjour,
Désolé mais :
Le top serait d'avoir l'ordre du choix mais si j'ai déjà un choix multiple, je serais comblé
La j'ai pas tout compris... Pourrais tu nous mettre (grâce à https://www.cjoint.com/index.php un fichier exemple, sans données confidentielles et en évitant les formats .xlsx, préférer .xls, qu'un max de gens puisse t'aider.

(lapin compris? Non! Lapon compris...)
Messages postés
12184
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
31 juillet 2020
2 463
Bonjour,
Vous avez alors deux choix :
- Validation/Données : dans ce cas il vous faudra écrire manuellement toutes les combinaisons possibles.
- par VBA : regardez ce classeur exemple et dites moi si cela convient. Si ok, je vous explique la démarche pour l'appliquer à votre classeur excel.
Messages postés
51
Date d'inscription
samedi 2 août 2008
Statut
Membre
Dernière intervention
6 décembre 2010
22
MErci pijaku pour la réponse,

effectivement la méthode VBA est pertinente. C'est même exactement ce que je souhaite !

Je veux bien être initié !!!

Merci
Messages postés
51
Date d'inscription
samedi 2 août 2008
Statut
Membre
Dernière intervention
6 décembre 2010
22
1- J'ai du faire une petite entorse à tes indications. J'ai touché à la propriété "Name" puisqu'en fait, un bouton de commande c'était caché derrière la Listebox (du coup dans le code j'avais d'abords "Commandbutton1_click" puis "Commandbutton2_click") => résultat ça fonctionne du feu de dieu !!!! Merci 1000 fois

2- Je me suis mal exprimé: en fait, il s'agit de renseigner le mode de déplacement sur une dizaine de trajets (soit une dizaine de lignes). Donc la question c'est: est ce que je doit reprendre le code pour les cases F6, F7, F8, etc. ou et ce que je peux changer le code pour que le choix se fasse non plus sur une seul case mais sur plusieurs (pas simultanément mais une case pour chaque déplacement ...). Je sais pas si c'est vraiment plus claire ...

En tout cas merci pour tout ce que tu as déjà fait pour mon problème !!!!
Messages postés
12184
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
31 juillet 2020
2 463
Tu as deux choix :
- Choix un : le + simple, mais celui qui comporte un défaut :
Tu décides de déclencher le lancement de l'UserForm dès qu'il y a double clic dans ta feuille, peu importe l'endroit. Le souci ici est que si un utilisateur double clic en F123, l'USF se lance...
- Choix deux : on définit préalablement une plage de cellules ou seulement dans cette plage se déclenchera l'USF au double clic.

Tout se passe dans le code de la feuille concernée. Donc :
Clic droit/Visualiser le code sur l'onglet de ta feuille "Lundi"
Tu obtiens ceci :
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) 
If Target.Address = "$B$4" Then 
    Target.Value = "" 
    Load UserForm1 
    UserForm1.Show 
End If 
End Sub

Choix un : code à modifier comme ceci :
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) 
    Target.Value = "" 
    Load UserForm1 
    UserForm1.Show 
End Sub
Le code se lance de toute ta feuille...

Choix deux : code à modifier comme ceci :
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) 
If Intersect(Target, Range("F1:F10")) Is Nothing Then 
 Exit Sub 
Else 
    Target.Value = "" 
    Load UserForm1 
    UserForm1.Show 
End If 
End Sub
Je pense que tu as vu que dans ce cas, le code ne se déclenchera que sur les cellules de la plage F1:F10...

Dans les deux cas, il est nécessaire de changer le code du bouton. En effet, il est clair que tu va double cliquer dans la cellule ou tu veux ton résultat. Donc cette cellule ne sera pas Range("C4"), mais la cellule active (ben oui si tu double clic dans une cellule elle devient la cellule active après le premier clic...). Cela se traduit en VBA au lieu de Range(machin) par : ActiveCell. Ton code de bouton (peu importe comment tu l'appelles ;-)) devient donc :
Private Sub MET_ICI_LE_BON_NOM_DU_BOUTON_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 
If ValeurARetourner = "" Then 
    MsgBox "Sélection obligatoire ou fermez avec la croix" 
    Exit Sub 
End If 
ActiveCell = Left(ValeurARetourner, Len(ValeurARetourner) - 3) 
ActiveCell.Offset(1, 0).Activate 
UserForm1.Hide 
Unload UserForm1 
End Sub


ps : j'ai amélioré le code du bouton pour obliger une sélection... teste le sans sélectionner de moyen de transport...

Tu dis...
Messages postés
51
Date d'inscription
samedi 2 août 2008
Statut
Membre
Dernière intervention
6 décembre 2010
22
Bonjour Pijaku,

J'ai remplacé les parties que tu m'as indiqué. Tout fonctionne (la box apparaît, le multi est activé, on a la bonne liste) sauf l'essentiel: le bouton "valider" ... qui ne valide pas. On est obligé de forcer la fermeture sans avoir pu choisir.

Une idée ?
Messages postés
51
Date d'inscription
samedi 2 août 2008
Statut
Membre
Dernière intervention
6 décembre 2010
22
Pendant que j'y suis, pourrais-je abuser de ton savoir ? oui ... ??

Pour étendre la macro à plusieurs case dans la colonne il faut que je bidouille le code, j'imagine. Ça serait trop simple d'étendre simplement aux cases adjacentes ...
3eme option je refait la même pour toutes les cases concernés (ce qui me semble pas très logique)
Messages postés
12184
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
31 juillet 2020
2 463
Pour le bouton, pas d'idée, il fonctionne super bien chez moi...
Tu as toujours ce code affecté au bouton? : (pour vérifier, va sous VBE et double clic sur le bouton)
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("Lundi")
.Range("B4") = Left(ValeurARetourner, Len(ValeurARetourner) - 3)
.Range("B5").Activate
End With
UserForm1.Hide
Unload UserForm1
End Sub


2- tu veux étendre la macro à plusieurs cases? La moi pas comprendre toi... Le bouton sert à envoyer la(es) valeur(s) choisie(s) en B4 ;cf ligne : .Range("B4") = Left(ValeurARetourner, Len(ValeurARetourner) - 3)
Tu veux que cette valeur se retrouve ou? ou tu veux? dans une cellule que tu as choisit préalablement? dans une plage définie à l'avance (toujours la même)? dans une plage indéfinie?
tu dis...
Messages postés
41
Date d'inscription
dimanche 16 octobre 2011
Statut
Membre
Dernière intervention
14 mai 2014

J'ai tenté de faire la macro mais ça ne fonctionne pas chez moi....en fait j'y suis arrivé sauf lorsqu'il faut changer les codes car moi aussi la liste est dans une autre feuille.

Je préfère la garder sur la même feuille aussi...mais si j'indique la colonne ou se trouve ma lise de choix...il faut qu'il n'y ait pas d'autres valeur sur cette même colonne ou d'autres data qui n'a rien à vois avec ma liste.

puis je vous envoyer mon fichier ? je ne suis pas aussi doué que pijaku :-)
Messages postés
41
Date d'inscription
dimanche 16 octobre 2011
Statut
Membre
Dernière intervention
14 mai 2014

Bonjour,

Je suis toujours en galère et j'arrive pas à comprendre ce qui beug..
J'ai réussi à faire ma macro mais je ne sais pas comment changé ma liste...
et l'autre difficulté c'est que je dois attribué des points au choix des réponses....

Help ! si je peux transmettre mon fichier svp...car je dois le rendre à 12h00
Messages postés
51
Date d'inscription
samedi 2 août 2008
Statut
Membre
Dernière intervention
6 décembre 2010
22
Ok - j'ai essayé et il m'indique une erreur de compilation. J'ai fait une capture d'écran: https://www.cjoint.com/?0kDo8a4ZyVD

Comme on est plus à une complication près, il faudrait que le choix se fasse aussi sur plusieurs feuilles (du lundi au dimanche) ... je sais j'en demande bcp bcp !

Merci d'avance
Messages postés
51
Date d'inscription
samedi 2 août 2008
Statut
Membre
Dernière intervention
6 décembre 2010
22
Autant pour moi ... c'est moi qui avait fait un problème dans le copier/coller ---
toutes mes excuses, pas d'erreur dans le code
Messages postés
51
Date d'inscription
samedi 2 août 2008
Statut
Membre
Dernière intervention
6 décembre 2010
22
Eh ... je suis tout confus.

Rien de compliqué en fait: j'ai copié/collé le code de la feuille1 vers la feuille2 et ça marche.

pijaku, je sais pas si ton pseudo est bizarre ou si c'est moi qui l'interprète bizarrement, mais derrière ce sobriquet, se cache un vrai génie.
Messages postés
12184
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
31 juillet 2020
2 463
1- je ne comprends pas l'erreur de compilation... Ta ListBox s'appelle toujours ListBox1?

2- Pour que l'USF se déclenche sur tes feuilles Mardi, Mercredi ... Facile!!!
Clic droit sur l'onglet lundi / Visualiser le code. Tu copies le code qui apparait.
Sur la gauche, tu as la fenêtre Projet (si si je l'ai vu dans la copie d'écran!!!)
dedans le nom de chacune de tes feuilles.
Double clic sur chaque nom de feuille ou tu souhaites que cela fonctionne et colles le code dans chaque fenêtre...
Tu fermes VBE et tu testes... Enfin, si tu arrives à résoudre le problème 1-
Si tu ne le résouds pas, envoie moi ton fichier par mail (dans mon profil- pour y accéder cliques sur mon pseudo et fouille) ou s'il n'y a pas de données confidentielles, place le sur https://www.cjoint.com/ ou http://www.cijoint.fr/ et reviens ici coller le lien ainsi créé.
Messages postés
51
Date d'inscription
samedi 2 août 2008
Statut
Membre
Dernière intervention
6 décembre 2010
22
Merci ça fonctionne nikel !!!!
Bonjour,

J'ai un petit problème.

J'ai utilisé cette macro pour faire une listbox à choix multiple qui va mettre toutes les valeurs sélectionnées, séparées par des points-virule dans une cellule.
Néanmoins, j'aurais besoin de sélectionner ces mêmes données mais que les valeurs qui seront affichées dans la cellule spécifiée soient celles de la colonne à droite de celle contenant les données. En gros dans la colonne C, j'ai une liste de noms, qui vont apparaitre dans la zone de liste à choix multiples et dans la colonne D les adresses emails correspondantes. Je voudrais donc sélectionner les noms et avoir dans une cellule les adresses mails, séparées par des points-virgules.

Un exemple vaut mieux qu'un discours, vous trouverez ici https://www.cjoint.com/c/2bunSq6okrQ mon classeur. Pour l'instant, je sélectionne les noms et ce sont les noms qui s'affichent dans la cellule cible.

Une âme charitable pourra m'aider ?

Encore merci d'avance !!!

R.
Messages postés
12184
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
31 juillet 2020
2 463
Salut,
Ben oui c'est ballot!!!!
En fait, il faudrait, pour ton cas, que la macro recherche dans les valeurs de la colonne C, les choix sélectionnés et renvoie la valeur contenue dans la cellule voisine col D.
Ca n'a rien à voir avec le sujet ici...
Bon 'dmettons...
Voici le code qui va te permettre de continuer :

Private Sub CommandButton1_Click()
Dim i As Byte
Dim ValeurARetourner As String
Dim Trouve As Range
Dim Valeur_cherchee As String
    For i = 0 To ListBox1.ListCount - 1
        If ListBox1.Selected(i) = True Then
            Valeur_cherchee = ListBox1.List(i)
            Set Trouve = Sheets("Feuil1").Columns(3).Cells.Find(What:=Valeur_cherchee, LookIn:=xlValues, lookat:=xlWhole)
                    If Trouve Is Nothing Then
                        MsgBox "Pas trouvé"
                    Else
                        ValeurARetourner = ValeurARetourner & Trouve.Offset(0, 1).Value & "; "
                    End If
            Set Trouve = Nothing
        End If
    Next i
Range("G13") = Left(ValeurARetourner, Len(ValeurARetourner) - 2)
Range("G15").Activate
UserForm1.Hide
Unload UserForm1
End Sub


Et ça, c'est cadeau, ça fait plaisir...

Merci beaucoup Pijaku, trés claire, trés precis, parfais pour un noob comme moi.
Que ferais-je sans des bonens ames comme toi.
Merci aussi a studio103 d'avoir posé la questions ;-)
Bonjour,

J'ai utilisé vos listes de codes, mais je souhaiterai pouvoir avoir 2 menus déroulants à choix multiples sur la même feuille.

J'ai donc créer deux userforms en renseignant toutes les lignes de code aqéquat.

Il me manque simplement la ligne de code a associé à la feuille excel. La manip suivante ne fonctionne, en effet, pas:

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Intersect(Target, Range("L2: L36")) Is Nothing Then
Exit Sub
Else
Target.Value = ""
Load UserForm1
UserForm1.Show
End If
If Intersect(Target, Range("N2: N36")) Is Nothing Then
Exit Sub
Else
Target.Value = ""
Load UserForm2
UserForm2.Show
End If
End Sub
Messages postés
12184
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
31 juillet 2020
2 463
Bonjour,
Essaye :
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Intersect(Target, Range("L2:L36,N2:N36")) Is Nothing Then
    Exit Sub
ElseIf Intersect(Target, Range("L2:L36")) Is Nothing Then
    Target.Value = ""
    Load UserForm2
    UserForm2.Show
ElseIf Intersect(Target, Range("N2:N36")) Is Nothing Then
    Target.Value = ""
    Load UserForm1
    UserForm1.Show
End If
End Sub
Merci!

Je tournais autour en bidoullant dans le sens de vos codes mais je ne trouvais pas la solution!

Cela fonctionne à merveille!
Je dois faire la même chose mais avec 4 menus mais je n'arrive pas!
Voilà mon code:


Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

If Intersect(Target, Range("AC6:AF2000")) Is Nothing Then
Exit Sub

ElseIf Intersect(Target, Range("AC6:AC2000")) Is Nothing Then
Target.Value = ""
Load UserForm3
UserForm3.Show

ElseIf Intersect(Target, Range("AD6:AD2000")) Is Nothing Then
Target.Value = ""
Load UserForm2
UserForm2.Show

ElseIf Intersect(Target, Range("AE6:AE2000")) Is Nothing Then
Target.Value = ""
Load UserForm3
UserForm3.Show

ElseIf Intersect(Target, Range("AF6:AF2000")) Is Nothing Then
Target.Value = ""
Load UserForm4
UserForm4.Show

End If
End Sub
J'ai testé cette macro !

Au final, lorsque je clique sur la cellule, le listing n'apparait pas.

De plus une erreur d'execution '6' apparaît . Il s'agit d'une erreur de dépassement de capacité. (Qu'est ce que cela veut dire ?)

Le listing que j'essaie de faire correspond à des noms de rue et il y a près de 300 noms !

Quelqu'un peut m'aider ?
OK
C'est dans la feuille appelée "test" que j'essaie de lister automatiquement les adresses

http://cjoint.com/?AKDjGUBrLyb
Messages postés
12184
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
31 juillet 2020
2 463
Et pourtant ça fonctionne...!!! Double clic en C3, comme convenu.
Le souci était dans le code de l'UserForm. Lorsque tu travailles dans un bloc With End With, si tu veux associer un objet à l'objet du bloc, il faut mettre un point devant.
Ici tu avais ce code :
With Sheets(blabla)
    ListBox1.AddItem Cells(Blibli)
End With
Sans point devant, le Cells(Blibli) se rapporte à la feuille active...
J'ai donc remplacé par :
Private Sub UserForm_Initialize()
Dim i As Integer, Derlig As Integer
ListBox1.Clear
With Sheets("Liste_Commerces_Concession")
Derlig = .Cells(65536, 29).End(xlUp).Row
    For i = 1 To Derlig
        ListBox1.AddItem .Cells(i, 29).Value
    Next i
End With
    For i = 0 To ListBox1.ListCount - 1
        If ListBox1.Selected(i) = True Then
            ListBox1.Selected(i) = False
        End If
    Next i
End Sub
Ok le listing se fait , cependant je ne peux pas sélectionner et ajouter la modalité que je souhaite.. l'erreur d'execution "6" apparait tout le temps ...
Messages postés
12184
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
31 juillet 2020
2 463
Oui. Tu as des variables déclarées As Byte (maxi 255) et As Integer.
Remplace Integer et Byte par Long :
Private Sub CommandButton1_Click()
Dim i As Long
Private Sub UserForm_Initialize()
Dim i As Long, Derlig As Long

Ensuite tu as une erreur également dans le nom de la feuille (code du bouton), la restitution des données doit se faire dans la feuille test... :
Private Sub CommandButton1_Click()
Dim i As Long
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("Test")
    .Range("C3") = Left(ValeurARetourner, Len(ValeurARetourner) - 3)
    .Range("C4").Activate
End With
UserForm1.Hide
Unload UserForm1
End Sub
Ok merci pour le coup de main :)
C'est vrai que j'ai bêtement laisser ces erreurs ...

le petit module fonctionne
Bonjour,
Pour mon stage, j'utilise une macro de liste déroulante à sélection multiple (comme la première donnée dans ce sujet) et souhiate maintenant l'appliquer à plusieurs cellules (de B3 à B21 inclus). Que dois-je modifier pour y arriver ?
Merci d'avance pour votre aide

PS : Voici une copie de la macro
Option Explicit

Private Sub ListBox1_Click()

End Sub

Private Sub Valider_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("PARC PRESSES")
.Range("B3") = Left(ValeurARetourner, Len(ValeurARetourner) - 3)
.Range("C3").Activate
End With
UserForm1.Hide
Unload UserForm1
End Sub

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

Derlig = Sheets("PARC PRESSES").Cells(65536, 5).End(xlUp).Row
    For i = 1 To Derlig
        ListBox1.AddItem Cells(i, 5).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
Messages postés
12184
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
31 juillet 2020
2 463
Bonjour,

Ce sujet commencant à dater un peu, je vous recommande de créer votre propre sujet dans ce forum. Cela attirera plus d'internautes pour vous aider.
Merci également de préciser davantage ce que vous voulez obtenir car là j'avoue ne pas avoir tout saisi.
Cordialement,
Bonjour pijaku,
J'ai suivi tes instructions et j'ai créé un nouveau sujet "Liste déroulante à choix multiples avec mémorisation pour ajout" --> aucun succès certainement parce que mon explication n'est pas très clair! et qu'en fait c'est + la suite de cette conversation.

En gros, j'ai créé une liste déroulante à choix multiples valide dans l'ensemble de mon tableau. C'est un tableau qui doit être rempli une première fois (base) puis des éléments doivent y être ajouté au fur et à mesure.
Problème : lorsque je double clic à nouveau sur une case dans laquelle la liste déroulante a déjà été utilisé et que je veux ajouter des éléments, ma première saisie disparaît, je ne peux donc plus visualiser les premiers éléments et je suis obligée de resaisir l'ensemble (anciennes et nouvelles données).
Un petit coup de main?
Merci d'avance
Messages postés
1
Date d'inscription
jeudi 5 décembre 2013
Statut
Membre
Dernière intervention
5 décembre 2013

Bonjour pijaku.
Je vous remercie pour tout vos précieux conseils et tuto.
Pour ma part, je vous remercie du petit coup de pouce que vous voudrez bien me donner.
Dans mon classeur : la feuille 1 contient dans la colonne A, des données provenant de la Feuille 2 Colonne B. Toujours dans ma feuille 1, la Colonne B doit contenir des données provenant de la feuille 2 Colonne C.
J'ai suivi les infos qu vous indiqué sur le site. Lorsque je double clique dans la feuille 1 colonne A le formulaire s'ouvre et la liste de la feuille 2 Colonne B s'affiche. Quand je clique sur la feuille 1 colonne B, le formulaire s'ouvre mais rien ne s'affiche à l'intérieur.
J'aurai besoin d'une grande aide Car je Doit finaliser mon document demain soir.
Avec Un très grand remerciement pour votre aide. Je vous joins mon fichier : https://www.cjoint.com/?0LfbOn4ObjV
Freeba.
Messages postés
12184
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
31 juillet 2020
2 463
Bonjour Freeba.
trop tard?
Messages postés
11
Date d'inscription
mercredi 15 janvier 2014
Statut
Membre
Dernière intervention
16 octobre 2014

Bonsoir Pijaku

J'ai également tout suivi mais cela ne fonctionne pas : ma case est active, mais la liste n'apparaît pas, ni le bouton valider.
J'ai pourtant bien suivi vos échanges et supprimer au fur et à mesure les erreurs de codes.

Pourriez-vous selon ce qui vous arrange :
- Jeter un rapide coup d'oeil à mon fichier et m'indiquer l'erreur : http://we.tl/S4jjA6mNMS
- M'indiquer la nouvelle conversation afin de trouver un sauveur

Merci par avance de votre retour

Julieha

PS : Bravo car en tant que novice, j'ai trouvé plein de solutions sur différents forum, la votre étant la seule que l'on puisse suivre en toute simplicité! Merci
Messages postés
11
Date d'inscription
mercredi 15 janvier 2014
Statut
Membre
Dernière intervention
16 octobre 2014

OK si j'ai bien compris je dois changer mon code comme ceci :

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

If Target.Column = 9 And Target.Row > 8 Then
Target.Value = ""
Load UserForm1
UserForm1.Show
End If
If Target.Column = 8 And Target.Row > 8 Then
Target.Value = ""
Load UserForm2
UserForm2.Show
End If
End Sub


J'ai du aussi refaire la modif de la feuille active dans le code userform2, et réactiver le multiselect. Tout fonctionne !

J'ai seulement le message d'erreur suivant lors que je fais la sélection des régions (mais quand je clique sur fin, ma sélection fonctionne tout de même)

Erreur d'execution 402 : vous devez fermer ou masquer la feuille modale de premier plan

Ensuite, ca m'a ajouter dans le code cette ligne : UserForm1.Hide

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 ActiveCell
.Value = 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
With Sheets("Feuil2")
Derlig = .Cells(65536, 1).End(xlUp).Row
For i = 1 To Derlig
ListBox1.AddItem .Cells(i, 1).Value
Next i
End With

ListBox1.ListIndex = -1
End Sub
Messages postés
12184
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
31 juillet 2020
2 463
peux tu refaire passer ton fichier?
Messages postés
11
Date d'inscription
mercredi 15 janvier 2014
Statut
Membre
Dernière intervention
16 octobre 2014

http://we.tl/qpTEWRuAyc

voici
Messages postés
12184
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
31 juillet 2020
2 463
Dans le code de fermeture de l'userform2 (au clic surle bouton), tu mets ceci :

UserForm1.Hide
Unload UserForm1


En fait, tu cherches à fermer l'userform1 au lieu du 2
Donc...

UserForm2.Hide
Unload UserForm2
Messages postés
11
Date d'inscription
mercredi 15 janvier 2014
Statut
Membre
Dernière intervention
16 octobre 2014

NICKEL

thx !
Messages postés
29
Date d'inscription
jeudi 15 décembre 2011
Statut
Membre
Dernière intervention
13 novembre 2017

Bonjour, encore un petit up de plus.
Je me suis servi de ce petit tuto très bien fait pour mon application qui fonctionne très bien.

Je double-clique sur une cellule de ma plage F1:F36. Lancement du formulaire; choix de plusieurs éléments dans la liste; clique sur le bouton. Tous les choix s'ajoutent dans la cellule où l'on a double cliqué.

Toutefois j'aimerais mettre 3 ListBox sur mon userform au lieu de une.
Jusque là pas de soucis.J'ai donc ajouté les deux autres de la même manière que la première.

Mais ensuite comment faire pour que lorsque l'on clique sur le bouton on récupère dans la cellule les sélection dans la listbox1
ET
celle de la listbox2 ET celle de la listbox3

Je poste mon fichier si qqn aurait une solution ça me rendrait un grand service

https://www.cjoint.com/c/EBcqUyzXPG4
Messages postés
12184
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
31 juillet 2020
2 463
Bonjour,

Je n'ai pas ouvert ton fichier, essaye d'abord d'adapter le code à ta situation et on constatera ensemble.
Tu dis avoir 3 listbox à retourner dans la même cellule.
Si c'est 3 listbox sont multi-sélection il faut, non plus boucler sur une seule listbox, mais sur les 3. Comme ceci :
Private Sub Valider_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
    For i = 0 To ListBox2.ListCount - 1
        If ListBox2.Selected(i) = True Then
            ValeurARetourner = ValeurARetourner & ListBox2.List(i) & " & "
        End If
    Next i
    For i = 0 To ListBox3.ListCount - 1
        If ListBox3.Selected(i) = True Then
            ValeurARetourner = ValeurARetourner & ListBox3.List(i) & " & "
        End If
    Next i
With Sheets("PARC PRESSES")
.Range("B3") = Left(ValeurARetourner, Len(ValeurARetourner) - 3)
.Range("C3").Activate
End With
UserForm1.Hide
Unload UserForm1
End Sub
Messages postés
29
Date d'inscription
jeudi 15 décembre 2011
Statut
Membre
Dernière intervention
13 novembre 2017

Merci pijaku c'est effectivement le morceau qu'il me manquait, je poste le fichier exemple juste au cas où qqn tomberait sur le sujet.

Il s'agit bien entendu d'un simple fichier exemple simplifié au maximum à adapter à son utilisation.


https://www.cjoint.com/c/EBekyZX5kBW
Messages postés
1
Date d'inscription
jeudi 16 avril 2015
Statut
Membre
Dernière intervention
16 avril 2015

Bonjour à toutes et tous,
Merci beaucoup pour ce tableau (le dernier posté par gauden01) tout simplement génial et magique !!!
Du coup, je me dis qu'il me faudrait trouver une approche simple pour appréhender les bases vba.
Merci encore !
Stéphane.
Bonjour à tous,

Tout d'abord un grand merci pour les infos au dessus, comme dit stephhubert c'est tout simplement magique.

J'ai mon fichier avec ma liste déroulante (1) VBA qui s'affiche par double click avec choix multiple sur la colonne C et j'ai créer une seconde liste déroulante (2) VBA avec choix multiple pour la colonne D.

Indépendamment elle fonctionne toute les deux, mais quand je veux qu'elle fonctionne toute les 2, seul le double Click en Colonne C fonctionne et ouvre la liste déroulant 1, lorsque je double click dans la colonne D je rentre simplement dans la cellule.

Si quelqu'un peut venir à mon secours, voici mon code pour le double_click :

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Intersect(Target, Range("C6:C220")) Is Nothing Then
Exit Sub
Else
Target.Value = ""
Load UserForm1
UserForm1.Show
End If

If Intersect(Target, Range("C6:C220")) Is Nothing Then
Exit Sub
Else
Target.Value = ""
Load UserForm2
UserForm2.Show
End If
End Sub

Merci d'avance...
Si ça peut aider d'autre personne, j'ai finalement trouvé la solution, il suffit de supprimer les "Exit Sub" et ça marche.
Merci beaucoup Pijaku pour le tuto ! En étant novice j'ai pu suivre et ma liste maintenant marche nikel.
Bonjour,
merci beaucoup pour tous les bons conseils fournis sur cette page!!
J'arrive a créer jusqu'à deux menus déroulants sur une même feuille. Cependant je dois avoir 5 menus déroulants se déclenchant respectivement dans des colonnes spécifiques. Par exemple, une liste pour la colonne M; une autre pour la colonne O; une autre pour la colonne Q; une autre pour la colonne S et une autre pour la colonne S.
Le code de ma feuille est actuellement le suivant:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
temp = Array("X", "")
If Not Application.Intersect(Target, Range("J5:J1000")) Is Nothing Then
With Target
P = Application.Match(Target, temp, 0)
If Not IsError(P) Then
If P = UBound(temp) + 1 Then P = 0
Else
P = 0
End If
Target = temp(P)
Cancel = True
End With
End If
If Intersect(Target, Range("M5:M1000")) Is Nothing Then
Target.Value = ""
Load UserForm2
UserForm2.Show
ElseIf Intersect(Target, Range("O5:O1000")) Is Nothing Then
Target.Value = ""
Load UserForm1
UserForm1.Show
ElseIf Intersect(Target, Range("Q5:Q1000")) Is Nothing Then
Target.Value = ""
Load UserForm3
UserForm3.Show
ElseIf Intersect(Target, Range("S5:S1000")) Is Nothing Then
Target.Value = ""
Load UserForm4
UserForm4.Show
ElseIf Intersect(Target, Range("U5:U1000")) Is Nothing Then
Target.Value = ""
Load UserForm5
UserForm5.Show
End If
End Sub
Merci de votre aide!