Menu déroulant à choix multiple

Bonjour,

Il existe déjà plusieurs sujets de ce type mais je n'arrive pas à adapter un code VBA existant à ma situation.

Mon niveau en VBA est très faible.

Je voudrais que les utilisateurs de ma matrice puissent choisir plusieurs options dans un menu déroulant.

Dans mon fichier ci-joint qui n'est qu'un exemple, colonne C, j'ai créé un menu déroulant à choix unique, j'aimerai le passer en choix multiple.

La liste d'options se trouve dans l'onglet "options".

J'aimerai que le code soit le plus malléable possible, si je puis dire.

Je m'explique, ma colonne "sticker_depliant" ne sera pas toujours en colonne C, c'est pourquoi je préférerai que le code s'adapte au titre de la colonne plutôt qu'à la colonne numéro 3 de cet exemple.

J'aimerai aussi que ce menu fonctionne pour toute la colonne, c'est à dire qu'il y est 3 lignes complétées ou 200, il faut qu'on puisse cocher ces options.

Il faudrait que les options cochées soit séparées par une virgule dans le résultat de la cellule.

J'aimerai réutiliser ce code pour plusieurs menus déroulants, s'il est possible de me préciser quels champs du code sont administrables ce serait l'idéal.

Merci d'avance à tout ceux qui liront mon message jusqu'ici , et merci encore plus à ceux qui se creuseront la tête pour essayer de trouver une solution.

Bien cordialement,

Cindy

Bonjour

Un essai à tester. Te convient-il ?

Bye !

Bonsoir Cindy,

Une autre proposition en pièce jointe :

On double-clique sur une cellule et, si une liste de choix est associée, les choix multiples s'affichent.

Tu peux enrichir les listes de choix de la feuilles "Options". Seule condition: que la liste de choix soit nommée comme l'entête de colonne du tableau (sticker_depliant_print, Titre, Colonne1, ...).

Bonjour Cindy,

J'aimerai que le code soit le plus malléable possible, si je puis dire.

Je m'explique, ma colonne "sticker_depliant" ne sera pas toujours en colonne C, c'est pourquoi je préférerai que le code s'adapte au titre de la colonne plutôt qu'à la colonne numéro 3 de cet exemple.

Dans ce cas, si je reprends le code de gmb que je salue, tu peux utiliser la procédure événementielle :

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Count > 1 Then Exit Sub
    If Cells(2, Target.Column).Value = "sticker_depliant_print" Or Cells(2, Target.Column).Value = "titre" Then
        UserForm1.Show
    End If
End Sub

et modifier les paramètres d'initialisation de l'userform comme suit :

Private Sub UserForm_initialize()
    ListBox1.List = Sheets("Options").Range(Cells(2, ActiveCell.Column).Value).Value
End Sub

j'ai modifié le nom de la zone Titres pour reprendre l'en-tête titre

@GVIALLES : belle réalisation !

Bonjour tout le monde,

Waoow !! Je suis toujours très surprise de constater l'aide que m'apporte les gens sur ce forum !

Merci beaucoup !

La solution de @GVIALLES est très intéressante, car elle ne réagit pas du tout de la même façon que la proposition de @gmb et @Steelson.

D'une part le double clic, finalement ça m'arrange, mais le plus fort c'est la réaction des cellules au face à un copié/collé.

Sur la solution @gmb - @Steelson, si on copie/colle une info, le menu est écrasé et donc il n'y a pas moyen de faire machine arrière.

Tandis que sur la solution de @GVIALLES, même après un copié/collé, le menu est toujours existant si on double-clic sur la cellule, et ça coche automatiquement l'option collé, à laquelle on peut recocher d'autres options.

C'est vraiment top.

Par contre, je suis embêtée car en fait mes colonnes sont renommées de la façon suivante :

sticker_depliant_print-rentree pour l'opération de la rentrée

sticker_depliant_print-toussaint pour l'opération de la Toussaint

Et ainsi de suite...

[Chaque opération à sa matrice, donc j'installe le code VBA sur chacune d'entre elle, pas de problème mais...]

Je ne peux pas renommer un groupe de cellule avec un tiret... Excel accepte les underscores... Mais pas les tirets

Avez-vous un moyen de contourner ce problème ? En sachant que mes titres de colonnes ne peuvent pas être modifié.

Bien à vous.

Cindy,

A ma connaissance, pas moyen de contourner les règles de nommage des plages EXCEL.

Pour qu'elle raison cette contrainte de "-" dans les entêtes de colonnes?

Les titres de colonnes correspondent à des attributs déjà existants sur un PIM, cette matrice sera ensuite importer sur cette outil pour compléter une base de données.

Sinon, il faudrait créer une macro que je lancerai indépendamment et qui dirait de remplacer le dernier underscore par un tiret, mais ça rajoute une manipulation. :s

Où, est-ce que, à tout hasard, votre macro pourrait dire que la liste à choix multiples fonctionnerait si la colonne s'appelait "sticker_depliant_print-rentree" mais que le groupe d'options s'appelait "sticker_depliant_print" ?

Est-ce qu'une règle pourrait dire que la colonne doit avoir le même nom que le groupe d'options "jusqu'au tiret" ?

Je suis absolument désolée, si c'est complètement absurde.

Et une autre question, lorsqu'on double clic et peu importe la cellule (même dans une colonne non concernée par le menu à choix multiples), la pop up du menu s'affiche une demi seconde, comme si à chaque double clic, la macro essaye de chercher une correspondance.

Est-ce normal ?

Merci

Cordialement.

Et une autre question, lorsqu'on double clic et peu importe la cellule (même dans une colonne non concernée par le menu à choix multiples), la pop up du menu s'affiche une demi seconde, comme si à chaque double clic, la macro essaye de chercher une correspondance.

Est-ce normal ?

je n'ai rien dit mais c'est ce qui m'a un peu gêné aussi ! cela n'enlève rien à la proposition de GVIALLES que je trouve intéressante ...

en cumulant ma proposition et celle de GVialles, on efface ce problème

Option Explicit

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    If Target.Count > 1 Then Exit Sub
    If Cells(2, Target.Column).Value = "sticker_depliant_print" Or Cells(2, Target.Column).Value = "titre" Then
        ListeChoixMultiples.Show
    End If
End Sub

oui mais je laisse quand même GVialles le finaliser en testant les noms du dossier comme il l'a fait dans la macro de l'userform !

en cumulant ma proposition et celle de GVialles, on efface ce problème

Option Explicit

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    If Target.Count > 1 Then Exit Sub
    If Cells(2, Target.Column).Value = "sticker_depliant_print" Or Cells(2, Target.Column).Value = "titre" Then
        ListeChoixMultiples.Show
    End If
End Sub

oui mais je laisse quand même GVialles le finaliser en testant les noms du dossier comme il l'a fait dans la macro de l'userform !

J'ai ajouté votre code à la macro de GVIALLES, effectivement lorsqu'on double clic, dans une autre colonne, la pop up n’apparaît plus sauf dans la colonne titre.

Pouvez-vous m'expliquer ce que veut dire " If Cells(2, Target.Column).Value = "sticker_depliant_print" Or Cells(2, Target.Column).Value = "titre" Then" svp ?

Je ne comprends pas pourquoi ="titre" apparaît dans votre code. Dans mon exemple seule, la colonne sticker_depliant_print était concerné par le menu ?

Merci d'avance.

Je ne comprends pas pourquoi ="titre" apparaît dans votre code. Dans mon exemple seule, la colonne sticker_depliant_print était concerné par le menu ?

désoolé, j'avais changé la zone Titres en titre pour rendre homogènes les en-têtes de colonne et les noms de zones comme je l'avais signalé :

j'ai modifié le nom de la zone Titres pour reprendre l'en-tête titre

GVialles a repris la même logique et a même été plus loin en s'appuyant sur les noms connus du fichier !

J'ai bien réalisé la correction finale correspondant à la macro de GVialles avec le test entre les titres des colonnes et les noms donnés dans le dossier, mais je lui laisse la paternité de la donner quand même (je respecte le travail des autres contributeurs) ...

Oui, on peut faire évoluer la macro dans ce sens.

Mais que doit-il se passer si un colonne a l'entête "sticker_depliant_print-rentree" et une autre colonne l'entête "sticker_depliant_print-toussaint"?

GVialles,

dans ta macro, je ferais bien ceci :

    sEnteteColonne = ActiveSheet.Cells(2, oCellActive.Column).Value
    sEnteteColonne = Mid(sEnteteColonne, 1, InStr(sEnteteColonne & "-", "-") - 1)

ce qui correspond à

Où, est-ce que, à tout hasard, votre macro pourrait dire que la liste à choix multiples fonctionnerait si la colonne s'appelait "sticker_depliant_print-rentree" mais que le groupe d'options s'appelait "sticker_depliant_print" ?

Est-ce qu'une règle pourrait dire que la colonne doit avoir le même nom que le groupe d'options "jusqu'au tiret" ?

Steelson,

J'ai compris que vous aviez remplacé Titre en titre, mais je ne comprends ce bout de code.

If Cells(2, Target.Column).Value = "sticker_depliant_print" Or Cells(2, Target.Column).Value = "titre" Then

Qu'apporte t-il au fonctionnement ou au résultat ?

J'ai l'impression que, si je traduis avec mon faible niveau ça veut dire ça : s'il y a une valeur dans la colonne sticker_depliant_print ou dans la colonne titre alors on fait apparaître la liste d'option.

J'aimerais que vous me disiez si ce n'est absolument pas ça ou si j'ai bien compris la mécanique.

Si, par hasard j'avais bien compris, ne faudrait-il pas enlever ce bout de code, car le menu ne doit pas apparaître dans la colonne titre.

Or Cells(2, Target.Column).Value = "titre" Then

J'ai peut-être rien compris alors n'hésitez pas à me le dire !

Merci beaucoup.

Oui, on peut faire évoluer la macro dans ce sens.

Mais que doit-il se passer si un colonne a l'entête "sticker_depliant_print-rentree" et une autre colonne l'entête "sticker_depliant_print-toussaint"?

Dans une même matrice, il n' y aura jamais "sticker_depliant_print-rentree" et "sticker_depliant_print-toussaint".

J'ai une matrice pour la Rentrée avec cette colonne "sticker_depliant_print-rentree"

Et dans un onglet "options" j'ai toutes mes listes renommées.

Et ensuite dans un autre fichier excel, j'ai ma matrice Toussaint avec une colonne "sticker_depliant_print-toussaint".

Et cependant mon onglets "options" est identique pour toutes mes matrices.

C'est pourquoi ma liste d'options est renommé "sticker_depliant_print", mais que mes en-têtes de colonnes peuvent varier avec "-rentree", "-toussaint" etc etc...

Compris Cindy,

Je te reviens avec ma macro modifiée.

Cindy,

En P.J. version avec modifications demandées.

s'il y a une valeur dans la colonne sticker_depliant_print ou dans la colonne titre alors on fait apparaître la liste d'option.

Si, par hasard j'avais bien compris, ne faudrait-il pas enlever ce bout de code, car le menu ne doit pas apparaître dans la colonne titre.

Or Cells(2, Target.Column).Value = "titre" Then

Absolument ! je n'avais pas compris cela pour les titres.

Cela deviendrait alors

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim i As Integer, booNameOK As Boolean

    If Target.Count > 1 Then Exit Sub

    booNameOK = False
    For i = 1 To ThisWorkbook.Names.Count
        If ThisWorkbook.Names(i).Name = Mid(Cells(2, Target.Column).Value, 1, InStr(Cells(2, Target.Column).Value & "-", "-") - 1) Then
            booNameOK = True
            Exit For
        End If
    Next

    If booNameOK Then ListeChoixMultiples.Show

End Sub

pour éviter le flash de l'userform qui s'ouvre et se ferme !

Bon, prends le retour de GVialles pour la modification de sa macro avec recherche auto des noms du dossier correspondants.

Bonjour Gvialles, Bonjour Steelson,

Merci beaucoup pour la nouvelle matrice qui s'adapte au nom du groupe d'options malgré l'entête un peu différente !

C'est vraiment top !

Steelson, merci beaucoup également pour le complément de la macro !

Juste une question, ce bout de code, je l'ai rajouté dans "feuil 1", c'est bien ça ? (voir pj feuil1)

feuil1

Ou est-ce qu'il fallait le mettre quelque part dans l'userform ? (voir pj userform)

userform

Merci beaucoup !!!!

Rechercher des sujets similaires à "menu deroulant choix multiple"