Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
Sujets que vous pourriez aussi aimer :
Menus contextuels
Avec le
VBA , il est possible de créer des
barres de menus contextuelles .
Sur l'exemple illustré par la capture, une zone d'influence est matérialisée par un fond jaune. Dès que l'utilisateur réalise un
clic droit sur l'une de ses cellules, il déclenche un
menu contextuel dont les rubriques sont agrémentées avec des icônes graphiques. Et s'il clique sur l'une d'entre elles, il déclenche l'affichage d'un
message contextuel , prouvant que nous sommes capables d'intercepter et de traiter le choix de l'utilisateur.
Classeur Excel à télécharger
L'étude peut se faire depuis un classeur vierge, même si nous proposons de baser les travaux sur un fichier existant.
Télécharger le fichier menus-contextuels-personnalises.xlsm en cliquant sur ce lien ,
Cliquer avec le bouton droit de la souris sur le nom du fichier réceptionné,
En bas du menu contextuel, choisir la rubrique Propriétés ,
En bas de la boîte de dialogue, cocher la case Débloquer et valider par Ok,
Puis, double cliquer sur le fichier pour l'ouvrir dans Excel ,
Nous découvrons bien la zone d'influence de la présentation. Mais à ce stade, si vous réalisez un clic droit sur l'une de ses cellules, c'est un menu
contextuel classique d'Excel qui se déclenche.
Construction du menu contextuel
La construction de la
barre contextuelle doit être initiée par une
procédure à placer dans un
module . Pour que cette barre soit opérationnelle dès l'ouverture du classeur, elle doit être appelée à se déclencher automatiquement.
Réaliser le raccourci clavier ALT + F11 pour basculer dans l'éditeur VBA Excel ,
Dans l'explorateur de projet sur la gauche, double cliquer sur l'élément Module1 ,
Ainsi, nous affichons sa feuille de code au centre de l'écran.
Sous la déclarative Option Explicit, créer la procédure Auto_Open , comme suit :
Sub Auto_Open()
menuContext
End Sub
Comme son nom l'indique, elle est amenée à se déclencher
automatiquement à l'ouverture du classeur . Nous aurions aussi pu réaliser cet appel (menuContext) depuis la
procédure Workbook_Open attachée à l'
élément ThisWorkbook . Mais il est intéressant de savoir qu'une autre méthode existe.
La procédure
Une procédure est donc appelée au démarrage mais elle n'existe pas encore. Nous devons donc la créer.
Sous la précédente procédure, créer la procédure menuContext, comme suit :
...
Sub menuContext()
Dim barreC As CommandBar
Dim elemC As CommandBarControl
End Sub
...
Elle est appelée au démarrage et désormais elle existe. Nous déclarons deux objets pour représenter une
barre de menu (barreC As CommandBar) et les
contrôles ou
rubriques (elemC As CommandBarControl) dans cette
barre de menu .
Initialiser la barre contextuelle
Maintenant que les objets ont été déclarés, nous pouvons commencer par créer cette barre de menu en initialisant l'
objet barreC .
A la suite du code, ajouter les instructions VBA suivantes :
...
On Error Resume Next
CommandBars("clicDroit").Delete
Set barreC = CommandBars.Add("clicDroit", msoBarPopup, Temporary:=True)
...
La troisième ligne exploite la
méthode Add de la
collection CommandBars , pour créer une
nouvelle barre d'outils . Nous la nommons
clicDroit . C'est désormais l'
objet barreC , ainsi initialisé (Set), qui la représente. En deuxième argument, nous indiquons qu'il doit s'agir d'un
menu contextuel (msoBarPopup) et non d'une barre classique. Nous sautons le troisième argument pour atteindre directement le quatrième que nous désignons par sa valeur d'attribut :
Temporary . Nous le réglons Ã
True pour indiquer qu'il s'agit d'une barre de commandes temporaire. C'est ainsi qu'elles sont supprimées lorsque l'application conteneur est fermée. La valeur par défaut est False.
Juste avant, nous choisissons d'ignorer les erreurs (On Error Resume Next). En effet, nous supprimons ensuite cette barre de commandes (CommandBars("clicDroit").Delete) si d'aventure elle existait encore. C'est seulement lorsqu'elle n'existe pas déjà qu'elle peut être créée.
Les commandes de la barre
Maintenant que l'objet parent est initialisé sur un
menu contextuel , nous allons pouvoir le personnaliser. Pour cela, nous devons initialiser l'
objet enfant elemC Ã plusieurs reprises sur les
contrôles qui doivent enrichir cette
barre .
A la suite du code, ajouter les instructions VBA suivantes :
...
Set elemC = barreC.Controls.Add(msoControlButton)
With elemC
.Caption = "Une action à une & heure précise ?"
.OnAction = "action1"
.FaceId = 126
End With
...
Grâce à la
collection Controls héritée par l'
objet barreC , nous ajoutons un nouveau bouton (msoControlButton) dans cette barre. Puis, nous le personnalisons dans un
bloc With , pour optimiser le code. Nous définissons son intitulé grâce à la
propriété héritée caption par l'
objet elemC . Le
symbole & devant une lettre signifie que vous pouvez appuyer sur cette dernière (h ici) avec la touche Alt, au lieu de cliquer. Enfin, la
propriété FaceId permet d'associer une
icône graphique .
Si vous souhaitez connaître toutes les possibilités, vous pouvez vous rendre à cette adresse :
https://fring.developpez.com/vba/excel/faceid/.
N'oublions pas de commenter le
gestionnaire d'événements construit à la volée (OnAction). Il appelle la
procédure action1 au
clic de l'utilisateur sur cette rubrique. Nous devons encore la créer mais nous n'en avons pas fini avec l'implémentation de cette barre.
Les autres rubriques
C'est exactement de la même façon que nous devons construire les autres rubriques de la barre, en réinitialisant notre
objet elemC , à chaque fois sur un nouveau contrôle.
A la suite du code, construire les autres rubriques, comme suit :
...
Set elemC = barreC.Controls.Add(msoControlButton)
With elemC
.Caption = "Un calcul E&xcel ?"
.OnAction = "action2"
.FaceId = 263
End With
Set elemC = barreC.Controls.Add(msoControlButton)
With elemC
.Caption = "Une mise en &forme ?"
.OnAction = "action3"
.FaceId = 108
End With
Set elemC = barreC.Controls.Add(msoControlButton)
With elemC
.Caption = "Envoyer vers &Access ?"
.OnAction = "action4"
.FaceId = 264
'Nouveau groupe - Barre de séparation horizontale, pour le style.
.BeginGroup = True
End With
Set elemC = barreC.Controls.Add(msoControlButton)
With elemC
.Caption = "Envoyer dans un document &Word ?"
.OnAction = "action5"
.FaceId = 42
End With
...
A chaque reprise, nous définissons un nouvel intitulé ainsi qu'une nouvelle icône et nous appelons une nouvelle procédure pour réaliser des
actions personnalisées , des
actions contextuelles . Notez néanmoins l'emploi de la
propriété BeginGroup dans la troisième de ces rubriques. Nous l'utilisons pour la figure de style et savoir qu'elle existe, afin de créer un
trait de séparation , semblant indiquer que nous changeons de thématique.
Les actions
Désormais, nous devons créer toutes les
procédures répondant aux
gestionnaires d'événements que nous avons créés à la volée respectivement dans chaque rubrique.
Après la procédure menuContext , créer les nouvelles procédures suivantes :
...
Sub action1()
MsgBox "Code VBA pour générer un événement."
End Sub
Sub action2()
MsgBox "Code VBA pour déclencher un calcul Excel sur cette case."
End Sub
Sub action3()
MsgBox "Code VBA pour formater la cellule."
End Sub
Sub action4()
MsgBox "Code VBA pour transférer les données dans une table Access."
End Sub
Sub action5()
MsgBox "Code VBA pour communiquer avec Word."
End Sub
...
Ici, nous nous contentons simplement d'afficher des messages personnalisés, grâce à la
fonction VBA MsgBox pour bien prouver que nous sommes en mesure d'intercepter le choix de l'utilisateur au clic. Mais dans un volet suivant, nous verrons comment engager de vraies actions, notamment à partir d'un planning devant recenser les indisponibilités des salariés en notifiant les raisons.
Déclencher au clic droit
Nous avons bien travaillé. La
barre de menu est prête à être sollicitée. Pour cela, elle doit être appelée par son nom, au
clic droit dans la zone d'influence. C'est ainsi que nous pourrons l'afficher.
Dans l'explorateur de projet sur la gauche, double cliquer sur l'élément Feuil1(contextes) ,
Ainsi, nous affichons au centre de l'écran, la
feuille de code associée à la
feuille Excel abritant la zone d'influence devant déclencher les
menus contextuels .
En haut de l'éditeur, déployer la liste déroulante de gauche,
Dans les propositions, choisir l'objet Worksheet ,
Déployer alors la liste déroulante de droite,
Dans les propositions, choisir l'événement associé BeforeRightClick ,
Son code est susceptible de se déclencher dès qu'un clic droit est réalisé dans une cellule de la feuille. Mais nous allons devoir restreindre son champ d'action à la zone d'influence. Quoiqu'il en soit, la procédure auto-générée se nomme
Worksheet_BeforeRightClick . De fait, la précédente (Worksheet_SelectionChange), peut être supprimée.
Dans les bornes de cette procédure, ajouter la déclaration et l'affectation suivantes :
...
Dim croisement As Range
Set croisement = Application.Intersect(Range("zone"), Target)
...
Nous déclarons l'
objet croisement comme une
plage de cellules (As Range). Il doit représenter l'
intersection entre le clic effectué et la zone d'influence. Justement dans l'enchaînement, grâce à la
fonction Intersect , nous l'initialisons sur le résultat du croisement de cette zone d'influence avec la cellule cliquée. En effet, l'
objet Target passé en paramètre de cette procédure événementielle, représente la cellule sur laquelle l'utilisateur a commis le clic droit. Cette zone d'influence quant à elle, est reconnue sous l'
intitulé zone . Vous pouvez le constater en déployant la
zoneNom en haut à gauche de la
feuille Excel .
Contrôler l'intersection
Maintenant, nous devons vérifier que la cellule cliquée avec le
bouton droit de la souris appartient bien à la
zone d'influence . Si le cas est avéré, nous devons déclencher l'affichage du
menu contextuel en l'appelant par son nom, soit :
clicDroit .
A la suite du code de la procédure, créer l'instruction conditionnelle suivante :
...
If Not croisement Is Nothing Then
CommandBars("clicDroit").ShowPopup
Cancel = True
End If
...
Si le clic est bien produit dans la zone, en d'autres termes, si l'intersection conduit bien à une cellule (If Not croisement Is Nothing), dans ces conditions, nous exploitons la
méthode ShowPopup sur la
collection CommandBars pour afficher le
menu contextuel (clicDroit) que nous avons créé. Ensuite, nous réglons le
paramètre Cancel transmis par la procédure Ã
True , pour abandonner le résultat du clic droit d'origine avec le menu contextuel habituel.
Afficher les menus personnalisés
Il est temps de tester ce code. Mais pour que la simulation soit viable, le classeur doit être rouvert afin que l'initialisation du menu contextuel soit enclenchée.
Enregistrer les modifications (CTRL + S) et fermer le classeur,
Puis, double cliquer de nouveau sur le nom du fichier pour le rouvrir,
Dès lors, réaliser un clic droit dans la zone d'influence,
Comme vous pouvez l'apprécier, le menu contextuel s'affiche, avec ses rubriques et ses icônes graphiques, en lieu et place du menu contextuel classique proposé par Excel. Et si vous cliquez sur l'une d'entre elles, c'est bien l'action programmée et personnalisée qui se déclenche.