Liste déroulante VBA

Bonsoir,

Je cherche à afficher une userform , qui contiendra une liste de codes, quand je clique droit sur une cellule de la colonne B (à partir du B3)de la feuille « Feuil1 ». Les codes seront cherchés dans la feuille « Liste ».

Et je voudrais savoir si c’est possible d’ajouter un bouton, sur la même userform, qui permet d’ajouter des codes en insérant un mot de passe.

fichier ci-joint.

Merci d’avance.

43classeur1.xlsx (9.38 Ko)

Bonsoir Emma, bonsoir le forum,

En pièce jointe ton fichier modifié. Un clic-du-bouton-droit dans une cellule adjacente à un numéro ouvre une UserForm.

• Soit tu sélectionnes un code existant dans la ComboBox1 et il est automatiquement renvoyé dans la cellule active.

• Soit tu tapes un nouveau code dans la ComboBox1

- Le bouton Ajouter apparaît

- Au clic dans ce bouton une boîte d'entrée te demande un mot de passe [toto] (à adapter)

- Si le mot de passe est correct, le code est rajouté dans la liste est dans la cellule active

- Sinon, tu retournes à la boîtes d'entrée pour une seconde tentative de mot de passe

- À la troisième tentative erronée l'UserForm se ferme...

Code en deux partie :

• Dans le composant Feuil1(Feuil1) pour réagir au clic-du-bouton-droit :

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean) 'au clic du bouton droit
'si le clic du bouton droit a lieu ailleurs que dans la colonne 2 (=B) ou dans une ligne inférieure à 3 ou
'dans une cellule de la colonne B qui n'a pas de numéro, sort de la procédure
If Target.Column <> 2 Or Application.Intersect(Target, Range("A2").CurrentRegion) Is Nothing Or Target.Row < 3 Then Exit Sub
Cancel = True 'évite le menu contextuel lié au clic du bouton droit
UserForm1.Top = Target.Offset(0, 1).Top + UserForm1.Height 'place l'Userform à proximité de la celluile cliquée (verticale)
UserForm1.Left = Target.Offset(0, 1).Left 'place l'Userform à proximité de la celluile cliquée (horizontale)
UserForm1.Show 'affiche l'userform1
End Sub

• Dans l'UserForm1 pour le reste :

Private O As Worksheet 'déclare la variable O (Onglet)
Private DL As Integer 'déclare la variable DL (Dernière Ligne)
Private T As Byte 'déclare la variable T (Tentative)

Private Sub UserForm_Initialize() 'à l'initialisation de l'UserForm
Me.CommandButton1.Visible = False 'masque le bouton "Ajouter"
T = 0 'initialise les tentatives T
Set O = Sheets("Liste") 'définit l'onglet O
DL = O.Cells(Application.Rows.Count, 1).End(xlUp).Row 'définit la dernière ligne éditée Dl de la colonne 1 (=A) de l'onglet O
Me.ComboBox1.List = O.Range("A3:A" & DL).Value 'alimente dynamiquement la ComboBox1
End Sub

Private Sub ComboBox1_Change() 'au changement dans la ComboBox1
If Me.ComboBox1.ListIndex = -1 Then 'condition : si la valeur de la ComboBox1 ne fait pas partie de ces éléemnts
    Me.CommandButton1.Visible = True 'affiche le bouton "Ajouter"
    Exit Sub 'sort de la procédure
End If 'fin de la condition
ActiveCell.Value = Me.ComboBox1.Value 'renvoie dans la cellue active le code choisi dans la ComboBox1
Unload Me 'vide et ferme l'UserForm en cours
End Sub

Private Sub CommandButton1_Click() 'bouton "Ajouter"
Dim MdP As Variant 'déclare la variable MdP (Mot de Passe"

ici: 'étiquette
MdP = Application.InputBox("Tapez le mot de passe !", "MOT DE PASSE", Type:=2) 'définit la boîte d'entrée MdP
If MdP = False Or MdP = "" Then 'condition si bouton Annuler ou si non renseignée
    Unload Me 'vide et ferme l'Userform
    Exit Sub 'sort de la procédure
End If 'fin de la condition
If MdP <> "toto" Then 'condition 1 : si le mot de passe est différent de "toto" (à adapter)
    MsgBox "Mot de passe non valide !" 'message
    T = T + 1 'incrémente la tentative T
    If T = 3 Then 'condition 2 : si T est égale à 3
        MsgBox "Nous n'avez droit qu`à trois tentatives !" 'message
        Unload Me 'vide et ferme l'UserForm en cours
        Exit Sub 'sort de la procédure
    End If 'fin de la condition 2
    GoTo ici 'retourne à la boîte d'entrée MdP via l'étiquette "ici"
End If 'fin de la condition 1
O.Cells(DL + 1, 1).Value = Me.ComboBox1.Value 'renvoie dans la premmière ligne vide de la colonne A de l'onglet O le nouveau code
ActiveCell.Value = Me.ComboBox1.Value ''renvoie dans la cellue active le nouveau code
Unload Me 'vide et ferme l'UserForm en cours
End Sub
81emma-v01.xlsm (20.65 Ko)

Bonjour ThauThème,

Merci infiniment pour ta réponse, ça marche très bien.. j'essaye de modifier le code afin de répondre à mon cahier de charges mais je n'arrive pas!

En fait, je cherche à intégrer le bouton "Ajouter" (qui permet de rajouter d'autres codes) sur l'UserForm .

En cliquant sur ce bouton une boîte d'entrée demande un mot de passe, et si c'est bon on peut ajouter d'autres codes.

Et si on peut rajouter un autre bouton qui permet de désactiver la saisie de d'autres codes.

Merci encore...

Re,

Heu... Ça y est déjà pour le bouton Ajouter !... Dans la Combobox1, au lieu de choisir, tape un code qui n'existe pas dans la liste et tu verras... Mais je t'avais expliqué tout ça dans mon premier post. Tu ne l'as pas lu ? Des fois, je me demande...

Pour le second bouton qui interdit l'ajout de nouveau code, je ne vois pas trop comment le faire fonctionner. On le mettrait où ? Sur un onglet, dans l'UserForm ? On clique et il bloque, OK. Mais si tu changes d'avis comment débloquer ? Si c'est en re cliquant dessus je ne vois pas l'intérêt sinon, il faut que tu m'expliques.

Re,

J'ai bien lu ton post et compris ton code, et je t'en remercie.

Sur ton code, pour le bouton "Ajouter" il faut taper un code qui n'existe pas et ensuite on a le bouton qui s'affiche et qui demande un mot de passe...

Ce que je cherche c'est d'avoir ce bouton sur l'userform dès le début. et donc si on veut ajouter un nouveau code je clique sur "Ajouter" il me demande un mot de passe et là je peut ajouter un ou plusieurs codes dans la 2eme case. Ci-joint un exemple, j'ai réussi à afficher le bouton "Ajouter".

Pour le second bouton, l'idée est de désactiver cette fonction d'ajout: en cliquant sur ce bouton je peux plus ajouter de codes, il va falloir réinsérer le mot de passe.

Voilà j’espère que j'ai bien expliqué mon problème.

Et merci encore..

ThauThème a écrit :

Re,

Heu... Ça y est déjà pour le bouton Ajouter !... Dans la Combobox1, au lieu de choisir, tape un code qui n'existe pas dans la liste et tu verras... Mais je t'avais expliqué tout ça dans mon premier post. Tu ne l'as pas lu ? Des fois, je me demande...

Pour le second bouton qui interdit l'ajout de nouveau code, je ne vois pas trop comment le faire fonctionner. On le mettrait où ? Sur un onglet, dans l'UserForm ? On clique et il bloque, OK. Mais si tu changes d'avis comment débloquer ? Si c'est en re cliquant dessus je ne vois pas l'intérêt sinon, il faut que tu m'expliques.

27emma-v01.xlsm (22.74 Ko)

Re,

Je pensais avoir simplifié la tâche et évité une TextBox inutile. En effet :

• si dans la ComboBox1 tu choisis un code existant, le bouton Ajouter n'a pas lieu d'être.

• Si tu veux ajouter un code pourquoi passer par une TextBox ?

Dans mon fichier, tu tapes ce nouveau code directement dans la ComboBox1 et, si il ne fait pas partie de la liste des éléments de la ComboBox1, le bouton Ajouter s'affiche automatiquement...

Mais puisque ça ne te convient pas je vais coder sur la TextBox ?

Sinon tu ne réponds pas à mes précédentes questions :

• où met-on le second bouton ? (onglet / userForm)

• Comment reactive-ton la fonction Ajouter ?

Re,

Je vais simplifier les choses:

Sur l'userform y aura la liste déroulante et 2 boutons, le premier permettra de déverrouiller la liste des codes pour en rajouter, et le 2ème servira pour le verrouillage.

Et donc mon Userform me permettra de choisir le code ou de verrouiller/déverrouiller la liste des codes. Pour ajouter un nouveau code je clique sur "déverrouiller " je saisie mon mot de passe et je l'ajoute directement dans la cellule, ce qui permettra aussi la m.à.j de la liste des codes. En fil le bouton "verrouiller" va servir à bloquer l'ajout de nouveaux codes.

Merci encore.

ThauThème a écrit :

Re,

Je pensais avoir simplifié la tâche et évité une TextBox inutile. En effet :

• si dans la ComboBox1 tu choisis un code existant, le bouton Ajouter n'a pas lieu d'être.

• Si tu veux ajouter un code pourquoi passer par une TextBox ?

Dans mon fichier, tu tapes ce nouveau code directement dans la ComboBox1 et, si il ne fait pas partie de la liste des éléments de la ComboBox1, le bouton Ajouter s'affiche automatiquement...

Mais puisque ça ne te convient pas je vais coder sur la TextBox ?

Sinon tu ne réponds pas à mes précédentes questions :

• où met-on le second bouton ? (onglet / userForm)

• Comment reactive-ton la fonction Ajouter ?

Re,

Donc, si j'ai bien compris, au départ l'ajout et verrouillé. Puis, à partir du moment où on a débloqué une fois (avec mot de passe), on peut rajouter autant de code que l'on veut, le mot de passe n'est plus demandé ? C'est ça ?

Oui c'es bient ça... et donc le 2ème bouton permet de déverouiller l'ajout.

ThauThème a écrit :

Re,

Donc, si j'ai bien compris, au départ l'ajout et verrouillé. Puis, à partir du moment où on a débloqué une fois (avec mot de passe), on peut rajouter autant de code que l'on veut, le mot de passe n'est plus demandé ? C'est ça ?

Re,

J'y travaille... Mais c'est plus complexe qu'il n'y paraît.

d'accord je te remercie infiniment...

ThauThème a écrit :

Re,

J'y travaille... Mais c'est plus complexe qu'il n'y paraît.

Bonsoir Emma, bonsoir le forum,

En pièce jointe la Verion 2. Les changements sont nombreux...

• Désormais le fait d'écrire un code ne ferme plus l'UserForm comme avant. Cela permet de pouvoir déverrouiller et ajouter plusieurs nouveaux codes en ne tapant qu'une seule fois le mot de passe. Pour cela, je le fait s'afficher en mode non modal ce qui permet à l'utilisateur de pouvoir sortir et sélectionner ou éditer dans le classeur Excel.

• À chaque écriture d'un code dans une cellule, la cellule du dessous est sélectionnée automatiquement.

• L'UserForm ne s'ouvre pas si plusieurs cellules sont sélectionnées avant le clic-du-bouton-droit.

• LUserForm ne s'ouvre qu'en cliquant dans la colonne B si la colonne A contient un numéro.

• Si l'Userform est déjà ouverte et que tu sélectionnes une cellule autre que dans la plage courante ou la colonne 2 (=B), la cellule active se place automatiquement en colonne 2 ou en fin de plage courante.

• Une fois que l'UserForm est fermée, elle se ré-ouvre toujours en mode Verrouiller (interdisant l'ajout de codes).

• La ComboBox1 n'est plus alimentée de la même manière. J'ai utilisé une plage nommée Codes via le Gestionnaires de noms (Ruban Formules) et la formule Decaler pour une alimentation dynamique. Quand un nouveau code est ajouté il est aussitôt pris en compte dans la liste des éléments de la ComboBox1...

Pour le reste, c'est ce que tu as demandé :

• Bouton "Déverouiller / Verouiller" (c'est le même bouton qui change de nom)

• Mot de passe (toto) avec trois tentatives permises. Pour le modifier, il te faut regarder le code du bouton :

Private Sub CommandButton2_Click() 'bouton "Verrouiller / Déverrouiller"

et remplacer dans cette ligne toto par le mot de passe qui te convient.

If MdP <> "toto" Then 'condition 1 : si le mot de passe est différent de "toto" (à adapter)

La touche [Échap] permet de fermer l'UserForm (propriété [Cancel = True] du bouton Sortir).

La touche [Entrée] permet d'ajouter une nouveau code (propriété [Default = True] du bouton Ajouter).

45emma-v02.xlsm (24.10 Ko)

Bonjour ThauThème,

Merci beaucoup pour ton aide, ça marche très bien....

une dernière question, comment peut-on masquer le mot de passe et afficher les ****?

Merci encore.

Bonjour Emma, bonjour le forum,

J'ai déjà vu ça dans des codes mais je ne l'ai pas retenu et je ne sais pas faire. Tu devrais ouvrir un nouveau fil pour ça je pense que tu obtiendras une réponse très vite...

Sinon, je trouve la manière de procéder qu'on a mis en place très étrange. Perso j'aurais fait un onglet d'accueil avec deux boutons. Un pour ajouter des nouveau code (avec mot de passe) directement dans l'onglet LISTE et un second qui renvoie dans l'autre onglet avec des listes de validation de données dans les cellules... C'eût été bien plus simple et tout aussi efficace !...

Re,

Je n'ai pas bien compris la fonction du second bouton? il permettra d'afficher la liste déroulante?

ThauThème a écrit :

Bonjour Emma, bonjour le forum,

J'ai déjà vu ça dans des codes mais je ne l'ai pas retenu et je ne sais pas faire. Tu devrais ouvrir un nouveau fil pour ça je pense que tu obtiendras une réponse très vite...

Sinon, je trouve la manière de procéder qu'on a mis en place très étrange. Perso j'aurais fait un onglet d'accueil avec deux boutons. Un pour ajouter des nouveau code (avec mot de passe) directement dans l'onglet LISTE et un second qui renvoie dans l'autre onglet avec des listes de validation de données dans les cellules... C'eût été bien plus simple et tout aussi efficace !...

Re,

Pour que tu comprennes mieux ce que je voulais dire, la version 3.

• Le fichier s'ouvre sur l'Interface.

• L'utilisateur clique sur le bouton Codes pour aller dans l'onglet Codes choisir un code dans la liste des cellules numérotées. Sans UserForm, directement dans les cellules de la colonne B.

Si un nouveau numéro est rajouté en colonne A, la cellule en B se voit automatiquement attribuer la plage nommée Codes comme liste de validation de données.

• Si il faut rajouter des nouveaux codes dans la liste. L'utilisateur retourne à l'interface et clique sur le bouton Ajouter Nouveau Code. Un mot de passe lui est demandé (trois tentatives avant la fermeture du fichier avec sauvegarde)...

Si le code est bon, l'onglet Liste s'affiche et l'utilisateur rentre directement dans les cellules le ou les nouveau code (sans UserForm).

Les nouveaux codes sont automatiquement pris en compte dans la liste de validation de données des cellules en colonne B de l'onglet Codes...

15emma-v03.xlsm (33.30 Ko)

Re,

je comprends mieux maintenant et je t'en remercie, mais je préfère la V2 car elle réponds bien à mon cahier de charges. Sinon pour masquer le mot de passe je n'ai pas trouvé! je pense pas que c'est possible avec le genre de fenêtre où je le saisie. Faut peut etre ajouter une autre?

Re,

Je vais rechercher de mon coté...

Bonsoir Emma, bonsoir le forum,

En pièce jointe la version 2 bis. Je n'ai pas réussi à masquer le texte dans la boîte d'entrée alors je l'ai remplacée par une seconde UserForm pour le mot de passe. Le principe reste le même que la V2...

• pour modifier le mot de passe c'est désormais dans le code du bouton Valider de l'UserForm2, la ligne :

If MDP = "toto" Then 'condition : si le mot de passe est égal à "toto"

• L'onglet Liste est masqué automatiquement à l'ouverture du classeur sinon on peut y rajouter des codes tout simplement... Pour l'afficher, il te faut aller dans l'éditeur VBE, sélectionner cet onglet dans le cadre en haut à droite et modifier sa propriété [Visible] à : -1 - xlSheetVisible

• Parce que j'avais besoin de variables publiques, qui ne peuvent être déclarées que dans un module standard, j'ai rajouté le module Module1. Il contient les deux variables T (Tentatives) et MDP (Mot De Passe)...

41emma-v02-bis.xlsm (37.12 Ko)

Bonsoir ThauThème,

Merci beaucoup pour ton aide. Ton code marche très bien.

Merci encore

Rechercher des sujets similaires à "liste deroulante vba"