Comprendre les événements avec Excel VBA

Plusieurs moyens permettent d’exécuter une procédure. L’une d’entre elles consiste à faire en sorte qu’elle le soit automatiquement à travers les événements. Ainsi, événements sont des “déclencheurs” de macros c’est-à-dire il est possible d’attribuer un code VBA à exécuter à un événement déclenché soit par l’utilisateur (ouverture de Classeur, changement de valeur dans une cellule,…) ou par Excel lui-même (actualisation des tableaux croisés dynamiques etc.).

1 Caractéristiques des événements

Un événement est toujours associé à un objet ou à une collection d’objets spécifique. Supposons un événement de niveau “feuille de calcul”, attaché à la première feuille du classeur. Si nous voulions que cet événement se déclenche quand l’utilisateur sélectionne de nouvelles cellules dans n’importe quelle feuille du classeur, il faudrait créer un événement de niveau “classeur”, s’appliquant à l’ensemble de ses feuilles. La feuille de calcul représente ici l’objet associé à l’événement. Il peut s’agir soit d’un objet existant, créé par l’utilisateur, soit d’un objet créé par la programmation.

Sous Excel, il existe cinq types principaux d’objets associés aux événements :

■ Feuille de calcul (Worksheet)

■ Feuille graphique (Chart)

■ Classeur (Workbook)

■ Application (instance d’Excel)

■ Boîte de dialogue (UserForm)

Les quatre premiers types d’objets sont spécifiques à Excel, alors que les UserForms peuvent s’utiliser dans toutes les autres applications (Access, Word…) intégrant VBA.

À ces types d’objets, il faut ajouter ceux qui sont créés et définis par la programmation par l’intermédiaire de modules de classe.

2 Pourquoi écrire un événement ?

Supposons que vous ayez un classeur dans lequel vous entrez des valeurs dans la colonne A. Votre chef vous dit qu’il a besoin de savoir quand chaque nombre a été saisi. Le fait d’entrer des données est un événement, plus précisément un événement appelé Worksheet_Change. Vous pouvez écrire une macro qui réagisse à cet événement.

REMARQUE                                                                                                                     

L’événement Worksheet_Change ne se produit pas lorsque les cellules sont modifiées pendant un recalcul. Utilisez l’événement Calculate pour un recalcul de feuille.

Cette macro sera déclenchée chaque fois que la feuille de calcul est modifiée. Si cette modification a été faite dans la colonne A, elle écrira la date et l’heure dans la colonne B, juste à droite de la cellule qui a été modifiée. Voyons dans un exemple à quoi une telle macro pourrait bien ressembler :

Private Sub Worksheet_Change (ByVal Target As Range)   
  If Target.Column = 1 Then     
     Target.Offset(0, 1) = Now   
  End if
End Sub

Commentaires

■ Comme nous l’avons déjà dit, l’événement Worksheet_Change produit quand un utilisateur modifie les cellules de la feuille de calcul. Sa syntaxe est :

Private Sub Worksheet_Change(ByVal Target As Range)
    Code
End Sub

■ Si la cible (Target) est la colonne A (Target.Column = 1), autrement dit, si les modifications se passent dans la colonne A, alors dans la colonne B (Target.Offset(0, 1)) marquez la date et l’heure de la modification (Now).

REMARQUE                                

Les macros qui répondent à des événements sont très attentives à l’endroit où elles sont enregistrées. Par exemple, cette macro Worksheet_Change doit être placée dans le module de code associé à cette feuille de calcul. Mettez-la ailleurs, et elle ne fonctionnera pas.

3 Les événements de classeur

L’événement Workbook_Open est principalement utilisé dans la pratique pour afficher des messages, pour configurer des environnements de travail définis par l’utilisateur, pour vérifier des faits ou pour effectuer de nombreuses autres tâches qui ont un caractère préparatoire.

Pour activer l’événement Workbook_Open, procédez comme suit :

  1. Appuyez sur la combinaison de touches Alt + F11 pour accéder à l’environnement de développement.
  2. Dans l’explorateur de projet, double-cliquez sur l’entrée ThisWorkbook.
  3. Dans la fenêtre de code, cliquez sur la flèche dans la zone de liste déroulante de gauche et sélectionnez l’entrée Workbook. Excel crée maintenant une macro d’événement prête à l’emploi pour vous par défaut.

Private Sub Workbook_Open()
End Sub
  1. En cliquant sur la deuxième zone de liste déroulante, vous verrez tous les événements disponibles qui peuvent être utilisés pour le classeur.

Il ne vous reste plus qu’à remplir la macro d’événement vide et prête à l’emploi avec d’autres commandes. Ces commandes sont ensuite traitées immédiatement après l’ouverture du classeur. Le tableau suivant présente la liste des événements Workbook les plus utilisés.

Événement Lorsqu’il est déclenché :
Workbook_Activate Le classeur est activé.
Workbook_BeforeClose Le classeur est fermé.
Workbook_BeforePrint Le classeur est imprimé.
Workbook_BeforeSave Le classeur est enregistré.
Workbook_Deactivate Le classeur est désactivé.
Workbook_NewSheet Une nouvelle feuille de calcul est insérée dans le classeur.
Workbook_Open Le classeur est ouvert.
Workbook_SheetActivate Une feuille de calcul du classeur est activée.
Workbook_SheetBeforeRightClick Un clic du bouton droit se produit dans une cellule de la feuille de calcul.
Workbook_SheetBeforeDoubleClick Un double clic se produit dans une cellule de la feuille de calcul.
Workbook_SheetCalculate Une feuille de calcul du classeur est recalculée.
Workbook_SheetChange Une cellule du classeur est modifiée.
Workbook_SheetDeactivate Une feuille de calcul du classeur est désactivée.
Workbook_SheetFollowHyperlink Un clic se produit sur un lien hypertexte du classeur.
Workbook_SheetSelectionChange La sélection est modifiée.
Workbook_WindowActivate La fenêtre du classeur est activée.
Workbook_WindowDeactivate La fenêtre du classeur est désactivée.
Workbook_WindowResize La fenêtre du classeur est redimensionnée.

L’événement Workbook_Open

Dans l’exemple qui va suivre, la procédure Workbook_Open est exécutée chaque fois que le classeur est ouvert. Elle vérifie le jour de la semaine : si c’est vendredi, le code affiche un message de rappel.

Private Sub Workbook_Open()
    Dim Message As String
    If WeekDay (Now) = 6 then
     Message = "C’est vendredi aujourd’hui."
     Message = Message & "N’oubliez pas de sauvegarder vos travaux."
     MsgBox Message
    End If
End Sub

Commentaires

■ La fonction WorkBook_Open est exécutée automatiquement chaque fois que le classeur est ouvert.

■ Elle utilise la fonction WeekDay de VBA pour déterminer le jour de la semaine. Si c’est vendredi (jour 6 chez les Anglo-saxons), un message rappelle à l’utilisateur qu’il doit effectuer sa sauvegarde hebdomadaire. Les autres jours, rien ne se produit.

■ L’opérateur & est utilisé pour concaténer des chaînes de caractères.

L’événement Workbook_BeforeClose

Voyons maintenant la procédure d’événement BeforeClose. Exécutée juste avant que le classeur se ferme, elle est localisée dans la fenêtre code de l’objet ThisWorkbook. Par exemple :

Private Sub Workbook_BeforeClose(Cancel As Boolean)   
   Dim Message As string  
   Dim Reponse As integer   
   Dim FNom As String  
     Message = "Désirez-vous sauvegarder ce fichier ?"   
   Reponse = MsgBox(Message vbYesNo)   
       If Reponse = vbYes Then    
           FNom = "F\SAUVEGARDES\" & ThisWorkbook.Name   
           ThisWorkbook.SaveCopyAs NomFichier   
      End If
End Sub

Commentaires

■ Cette routine affiche une boîte de message demandant à l’utilisateur s’il désire effectuer une copie de sauvegarde du classeur.

■ S’il clique sur le bouton Oui, le code utilise la méthode SaveCopyAs pour enregistrer le fichier sur le lecteur F (le lecteur te le chemin devraient bien sûr être adaptés à votre propre configuration).

Les programmeurs utilisent souvent la procédure Workbook_BeforeClose pour faire le ménage. Par exemple, après avoir modifié une option du classeur (comme masquer la barre d’état, par exemple), il est approprié de la rétablir au moment de quitter le classeur. Cet exemple est typiquement une tâche à confier à la procédure Workbook_BeforeClose.

Cet événement présente tout de même un inconvénient. Si vous refermez Excel et qu’un fichier ouvert a été modifié depuis la dernière sauvegarde, l’application vous demandera comme d’habitude si vous voulez enregistrer les changements opérés. Le fait de cliquer sur le bouton Annuler annule le processus de fermeture d’Excel. Mais la procédure Workbook_BeforeClose aura tout de même été exécutée.

L’événement Workbook_BeforeSave

L’événement BeforeSave est déclenché avant l’enregistreur d’un classeur. Il se produit lorsque vous utilisez la commande Fichier/Enregistrer ou Fichier/Enregistrer sous.

Placée dans la fenêtre Code d’un objet This Workbook, la procédure suivante démontre le fonctionnement de cet événement. La procédure met à jour la valeur de la cellule A1 de la feuille Feuil1 chaque fois que le classeur est enregistré. En d’autres termes, la cellule A1 sert de compteur indiquant le nombre de fois que le fichier a été sauvegardé.

Private Sub Workbook_BeforeSave(ByVal SaveAsUi As Boolean, Cancel As Boolean)
 Sheets("Feuil1").Range("A1").Value =_    
 Sheets("Feuil1").Range("A1").Value + 1
End Sub

Commentaires

■ Notez que la procédure Workbook_BeforeSave a deux arguments : SaveAsUI et Cancel. Pour comprendre leur fonctionnement, examinez la macro suivante, qui est exécutée avant l’enregistreur du classeur. Elle essaie d’empêcher l’utilisateur de sauvegarder le classeur sous un autre nom. Si celui-ci choisit la commande Fichier/Enregistrer sous, l’argument SaveAsUI est True (vrai).

■ Lorsque le code est exécuté, il vérifie la valeur de SaveAsUI. Si sa valeur renvoie True, la procédure affiche un message et met Cancel également sur True, ce qui annule l’opérateur de sauvegarde.

Private Sub Workbook_BeforeSave(ByVal SaveAsUi As Boolean, Cancel As Boolean)   
   If SaveAsUI Then     
    MsgBox "vous ne pouvez pas enregistrer de copie de ce classeur !")     
     Cancel = True   
   End If
End Sub

Commentaires

■ En fait, cette procédure n’empêche pas réellement quelqu’un d’enregistrer le classeur sous un nom différent. Il suffit d’ouvrir le classeur avec ses macros désactivées, et le tour est joué.

■ En effet, dans ce cas, toutes les procédures de gestion d’événements sont elles aussi désactivées. Ce qui est parfaitement logique, puisque ce sont aussi des macros…

4 Evénements de feuille de calcul

Pour définir un événement pour une feuille de calcul, procédez comme suit:

  1. Appuyez sur la combinaison de touches Alt + F11 pour accéder à l’environnement de développement.
  2. Dans l’Explorateur de projets, double-cliquez sur la feuille de calcul à laquelle vous souhaitez affecter l’événement.
  3. Dans la fenêtre de code, cliquez sur la flèche dans la zone de liste déroulante de gauche et sélectionnez l’entrée Worksheet.
  4. Sélectionnez ensuite l’événement souhaité dans la deuxième zone de liste déroulante.

Le tableau suivant présente une liste des événement Worksheet les plus utilisés.

Evénement Lorsqu’il est déclenché :
Worksheet_Activate La feuille est activée.
Worksheet_SheetActivate Une feuille de calcul du classeur est activée.
Worksheet_BeforeRightClick Un clic du bouton droit se produit dans la feuille de calcul.
Worksheet_BeforeDoubleClick Un double clic se produit dans la feuille de calcul.
Worksheet_Deactivate Une feuille de calcul est désactivée.
Worksheet_Calculate La feuille de calcul est recalculée.
Worksheet_Change Une cellule de la feuille de calcul est modifiée.
Worksheet_SelectionChange La sélection est modifiée.

L’événement Worksheet_BeforeDoubleClick

Vous pouvez configurer une procédure VBA à exécuter lorsque l’utilisateur double-clique sur une cellule. Dans l’exemple suivant (qui est stocké dans la fenêtre Code pour un objet Feuil), un double-clic sur une cellule rend la cellule en gras (si elle n’est pas en gras) ou pas en gras (si elle est en gras).

La procédure WorkSheet_BeforeDoubleClick a deux arguments : Target et Cancel. Target est la cellule (un objet Range) qui est double-cliquée. Si Cancel est sur True, l’action par défaut du double clic ne se produit pas.

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As
   Excel.Range, Cancel As Boolean)   
   Target.Font.Bold = Not Target.Font.Bold   
   Cancel = True
End Sub

 

Notez que Cancel est défini avec la valeur True. Cela empêche l’action par défaut (activer le mode édition de cellule d’Excel) de se produire.

L’événement Worksheet_Activate

Excel peut détecter si une feuille est activée ou désactivée et exécuter une macro lorsque l’un ou l’autre de ces événements se produit. Ces procédures d’événement doivent être placées dans la fenêtre Code de l’objet Feuil. Pour accéder rapidement à la fenêtre de code d’une feuille, faites un clic droit sur l’onglet de celle-ci et choisissez la commande Visualiser le code. L’exemple qui suit montre une procédure simple qui est exécutée chaque fois qu’une feuille donnée est activée. Elle ouvre une boîte de message qui affiche le nom de la feuille active :

Private Sub Worksheet_Activate()   
   MsgBox "Vous venez d'activer la feuille "& ActiveSheet.Name
En Sub

Voici un autre exemple qui rend la cellule A1 courante chaque fois qu’une feuille est activée :

Private Sub Worksheet_Activate()   
   Range("A1").Activate
End Sub

Ces exemples sont très élémentaires, mais une procédure d’événement peut être beaucoup plus complexe. La procédure qui suit, stockée dans la fenêtre Code de l’objet Feuil1, utilise l’événement Deactivate pour empêcher l’utilisateur d’activer toute autre feuille du classeur. Lorsque Feuil1 est désactivée (c’est-à-dire qu’une autre feuille est activée), un message est affiché puis Feuil1 est de nouveau activé :

Private Sub Worksheet_Activate()   
  MsgBox "Vous devez rester dans Feuil1."   
   Sheets("Feuil1").Activate
End Sub

Pour autant je ne vous conseille pas d’utiliser ce genre de procédure pour essayer de court-circuiter Excel. Cela pourrait être très frustrant et source de confusion pour l’utilisateur d’une part, et d’autre part facile à contourner en désactivant les macros. Il vaut mieux profiter de ces possibilités pour aider vos utilisateurs à se servir correctement de votre application.

L’événement Worksheet_Change

Un événement Change se produit chaque fois qu’une cellule de la feuille de calcul est modifiée. Dans l’exemple qui suit, la procédure Worksheet_Change empêche effectivement un utilisateur d’entrer une valeur non numérique dans la cellule A1. Cet événement est stocké dans la fenêtre Code de l’objet Feuil.

Private Sub Worksheet_Change(ByVal Target As Range)   
    If Target.Address = "$A$1" Then     
     If Not IsNumeric(Target) Then        
      MsgBox "Entrez un nombre dans la cellule A1."        
      Range("A1").ClearContents        
      Range("A1").Activate     
    End If   
  End If
End Sub

Commentaires

■ L’unique argument de la procédure WorkSheet_Change (Target) représente la plage qui a été modifiée. La première instruction vérifie si l’adresse de la cellule est bien $A$1. Si oui, le code utilise la fonction IsNumeric pour déterminer si elle contient une valeur numérique. Si ce n’est pas le cas, un message apparaît et la valeur de la cellule est effacée.

■ La cellule A1 est ensuite réactivée, ce qui est commode lorsque le pointeur de la cellule s’est déplacé après la saisie. Si une cellule autre que A1 est modifiée, il ne se passe rien.

4 Accéder plus facilement aux propriétés, méthodes et événements
Considérez-vous initié dans le monde merveilleux des objets, des propriétés, des méthodes et des événements. Vous en saurez plus sur ces concepts dans les chapitres qui suivent celui-ci. Si vous n’en avez jamais assez, vous pouvez également vous intéresser à trois autres excellents outils:
■ Système d’aide de VBA
■ Le navigateur d’objets
■ Membres de la liste automatique
Le système d’aide VBA décrit chaque objet, propriété et méthode disponible. Ceci est une excellente ressource pour en savoir plus sur VBA, et il est plus complet que n’importe quel livre sur le marché.
“Si vous travaillez dans un module VBA et que vous voulez des informations sur un objet, méthode ou propriété, déplacez le curseur sur le mot qui vous intéresse et appuyez sur F1. En quelques secondes, vous voyez le sujet d’aide approprié, avec des références croisées et peut-être même un ou deux exemples.

Le catalogue d’objets est une autre façon de se familiariser rapidement avec l’environnement de développement et de se familiariser avec les commandes VBA. Ce catalogue contient toutes les commandes VBA disponibles que vous pouvez utiliser pour la programmation. Vous démarrez le catalogue d’objets en

sélectionnant la commande Explorateur d’objets dans le menu Affichage ou en appuyant sur la touche F2.

L’environnement de développement vous fournit un catalogue d’objets dans lequel vous pouvez obtenir des informations sur les objets, les méthodes, les événements et les propriétés. Vous pouvez voir s’il s’agit d’un objet, d’une propriété, d’une méthode ou d’un événement via le symbole correspondant.

Tous les objets disponibles dans VBA sont gérés dans des bibliothèques. Par défaut, l’entrée Toutes bibliothèques est sélectionnée dans le premier menu déroulant. Si vous souhaitez restreindre un peu l’affichage et voir le contenu des bibliothèques individuelles, sélectionnez la bibliothèque souhaitée dans la liste déroulante.

S’abonner
Notifier de
0 Commentaires
Inline Feedbacks
Voir tous les commentaires

Initiation à Excel

Fonctions Excel

Excel VBA

Macros VBA Utiles

Plus d'outils

Sur Facebook

Sur YouTube

0
Nous aimerions avoir votre avis, veuillez laisser un commentaire.x