Menu contextuel dans une ListBox (après clic-droit souris)

CraigY - 11 mars 2016 à 13:10 - Dernière réponse : ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 11 avril 2018 Dernière intervention
- 12 mars 2016 à 07:26
Bonjour,

c'est toujours un plaisir de discuter avec vous!

j'ai une ListBox contenant plusieurs colonnes sur laquelle est chargée des données sur les clients (Code, Noms, prénoms, Adresse tel, Boite postale, etc)

Question : Comment procéder pour faire apparaître un menu contextuel à chaque clic-droit souris sur un client?

Utilité : Le menu contextuel pourra me permettre d'ajouter/modifier ou supprimer un client dans la liste.


Voici mon code d'initialisation de l'UserForm

Private Sub UserForm_Initialize()
Dim i, NbLigne as integer

sheets("Feuil1").Activate
NbLigne = Sheets("Relevé_par_Clt").[m65000].End(xlUp).Row

Me.ListBox1.RowSource = Sheets("Feuil1").Range(Cells(2, 1), Cells(NbLigne, 10)).Address

End sub

A vous lire
Afficher la suite 

Votre réponse

8 réponses

ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 11 avril 2018 Dernière intervention - 11 mars 2016 à 15:14
ah oui oui, c'est bel et bien moi...Merci encore
l'alternative de msgbox proposée par cs_Le Pivert est bien. Mais ne correspond pas la logique que je souhaiterais avoir : un vrai menu contextuel par le clic droit de la souris.


Private Sub ListBox1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
MsgBox "Hello line1" & vbNewLine & "Hello line2" & vbNewLine & "Hello line4" & vbNewLine & "Hello line4"
End Sub
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 11 avril 2018 Dernière intervention > CraigY - 11 mars 2016 à 17:01
Voilà l'inconvénient de traiter sous plusieurs pseudos différents.
...l'alternative de msgbox proposée par cs_Le Pivert...

est ici un véritable "mystère" pour tout nouveau lecteur ...
Commenter la réponse de ucfoutu
cs_MPi 3869 Messages postés mardi 19 mars 2002Date d'inscription 25 mai 2018 Dernière intervention - 11 mars 2016 à 16:11
0
Merci
Regarde l'exemple donné par Andy Pope à la fin de ce message.
http://www.ozgrid.com/forum/showthread.php?t=64139

Il a l'avantage d'être assez simple...
Commenter la réponse de cs_MPi
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 11 avril 2018 Dernière intervention - Modifié par ucfoutu le 11/03/2016 à 16:48
0
Merci
Le plus simple pour toi est encore de très loin d'utiliser un Frame et d'y mettre les 3 boutons (suppression, modification, ajout).
Il suffit ensuite de jouer avec la propriété visible de ce Frame (à rendre visible au click droit et invisible à l'issue des instructions du bouton cliqué).
J'appelle toutefois tonj attention sur un point important : je vois que ta listbox est liée. Ce qui signifie que tu ne pourras en aucun cas agir directement sur elle, mais qu'il te faudra agir sur la plage à laquelle elle est liée (et les modifs dans la plage seront alors réperctutées automatiquement dans la listbox)
Je vois également que ta listbox est liée à une plage de plusieurs colonnes. Il te faudra donc bien évidemment également gérer tout cela si, dans un cas de modification, la modification n'est pas limitée à l'article de la première colonne.
Tout cela n'est pas une opération isolée (relire les règles), mais un ensemble complet, tant de conception que de gestion.
Je viens de te mettre sur les rails. A toi, maintenant de t'y mettre (autrement qu'en te contentant de nous montrer que tu as lié ta listbox)
Je t'aiderai bien volontiers si tu rencontres une difficulté dans le cours de ce développement, mais à la condition sine qua non que la difficulté à traiter ne concerne pas l'ensemble de ce mécanisme, mais un point bien isolé de ce mécanisme.
________________________
Nul ne saurait valablement coder ce qu'il ne saurait exposer clairement.
Commenter la réponse de ucfoutu
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 11 avril 2018 Dernière intervention - Modifié par ucfoutu le 11/03/2016 à 17:59
0
Merci
Je commencerais à ta place par l'étape 1 (si tu ne l'as même pas encore franchie), à savoir :
Exécuter une/des instructions simple(s) au click droit sur la listbox.
Ce n'est qu'après avoir maîtrisé cette étape, que je m'entraînerais à déterminer si un article a été sélectionné. Et si oui : lequel et à quelle cellule il correspond
Inutile de tenter au-delà tant tu ne sais pas gérer ces deux étapes liminaires (la partie la plus simple).
Il ne te viendrait (n'est-pas ?) jamais à l'idée, par exemple, de vouloir installer une porte sans avoir d'abord fait le chambranle nécessaire .. voire sans même avoir construit le mur sur lequel mettre ce chambranle ...

________________________
Nul ne saurait valablement coder ce qu'il ne saurait exposer clairement.
Commenter la réponse de ucfoutu
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionModérateurStatut 11 avril 2018 Dernière intervention - Modifié par ucfoutu le 12/03/2016 à 08:26
0
Merci
Quelques indications pour que tu commences à t'y mettre (mais il va falloir que tu t'y mettes) :
- un click droit peut se constater dans la procédure évènementielle MouseDown de la listbox. Le paramètre Button de ladite procédure a plusieurs valeurs en fonction du bouton utilisé.
- l'article sélectionné d'une listbox a pour index la propriété Lisxtindex de la listbox. Si aucun article n'y a été sélectionné, cette propriété = -1
- le premier article d'une listbox a pour index 0. Si la listbox est liée à une plage de cellules, il correspond au rang de la première cellule de cette plage
- lorsque l'on modifie une/des cellule(s) de la plage à laquelle est liée une listbox, les modifications faites dans la plage sont automatiquement répercutées sur la listbox.
- la liaison d'une listbox à une plage de cellules est faite par la propriété RowSource de la listbox.
Il est à ce propos à noter que cette ligne de code (que tu as écrite)
Me.ListBox1.RowSource = Sheets("Feuil1").Range(Cells(2, 1), Cells(NbLigne, 10)).Address 

ne respecte pas la syntaxe attendue pour la définition de la propriété RowSource !
Ouvre s'il te plait ton aide VBA à la rubrique concernée. Lis et applique !
Pour lier par exemple à la plage "A1:B10" de la feuille "toto", la syntaxe serait :
Me.listbox1.rowsource = "toto!A1:B10"
Il s'agit là d'une chaîne de caractères. Tu peux dès lors la construire également par concaténation, si elle utilise des variables

Cette propriété définit la plage de liaison. Il est alors clair qu'en cas de suppression ou d'ajout de lignes dans la plage liée, cette propriété RowSource doit être redéfinie pour correspondre à la plage ainsi étendue ou réduite.
Voilà les indications essentielles qui vont t'être nécessaires pour construire ton mécanisme.
Complète-les par la consultation des rubriques de ton aide VBA.
Tout cela est simple. Encore faut-il s'y mettre un peu.

________________________
Nul ne saurait valablement coder ce qu'il ne saurait exposer clairement.
Commenter la réponse de ucfoutu

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.