formateur informatique

Barres de menu contextuelles en VBA Excel

Accueil  >  Bureautique  >  Excel  >  Excel VBA  >  Barres de menu contextuelles en VBA Excel
Livres à télécharger


Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :


Inscription Newsletter    Abonner à Youtube    Vidéos astuces Instagram
Sujets que vous pourriez aussi aimer :


Menus contextuels

Avec le VBA, il est possible de créer des barres de menus contextuelles.

Clics droits pour menus contextuels personnalisés en VBA Excel

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.

Icônes graphiques pour boutons de barres de menus contextuelles en VBA Excel

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.

Déclencher un code VBA Excel au clic droit de la souris
  • 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.

Créer un menu contextuel personnalisé en VBA Excel

 
Sur Facebook
Sur Youtube
Les livres
Contact
Mentions légales



Abonnement à la chaîne Youtube
Partager la formation
Partager sur Facebook
Partager sur Twitter
Partager sur LinkedIn