Cours VBA : les événements Workbook
Les événements
Jusque-là, nous avons lancé nos macros en cliquant sur un bouton.
Il est également possible de les exécuter automatiquement lors d'un événement particulier du classeur, tel que l'ouverture du classeur, sa fermeture, son enregistrement, etc.
Workbook_Open (à l'ouverture)
Pour exécuter des instructions à l'ouverture du classeur (après l'activation des macros par l'utilisateur), rendez-vous dans ThisWorkbook et sélectionnez Workbook :

L'événement Workbook_Open est ajouté par défaut, il agit à l'ouverture du classeur :
Private Sub Workbook_Open()
End Sub
Par exemple, en ajoutant l'instruction suivante, une boîte de dialogue sera affichée à l'ouverture du classeur :
Private Sub Workbook_Open()
MsgBox "Message de bienvenue"
End Sub
Workbook_BeforeClose (avant fermeture)
Pour exécuter des instructions juste avant la fermeture du classeur, choisissez BeforeClose :

Private Sub Workbook_BeforeClose(Cancel As Boolean)
End Sub
La fermeture du classeur peut être annulée en attribuant la valeur True à la variable Cancel.
Voici un exemple où l'utilisateur doit confirmer la fermeture du classeur :
Private Sub Workbook_BeforeClose(Cancel As Boolean)
'Si l'utilisateur répond Non, la variable Cancel vaudra True (ce qui annulera la fermeture)
If MsgBox("Etes-vous certain de vouloir fermer ce classeur ?", 36, "Confirmation") = vbNo Then
Cancel = True
End If
End Sub
Workbook_BeforeSave (avant enregistrement)
Cet événement se déclenche juste avant l'enregistrement :
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
End Sub
L'enregistrement peut être annulé en attribuant la valeur True à la variable Cancel.
Workbook_AfterSave (après enregistrement)
Cet événement se déclenche juste après l'enregistrement :
Private Sub Workbook_AfterSave(ByVal Success As Boolean)
End Sub
Workbook_BeforePrint (avant impression)
Cet événement se déclenche juste avant l'impression :
Private Sub Workbook_BeforePrint(Cancel As Boolean)
End Sub
L'impression peut être annulée en attribuant la valeur True à la variable Cancel.
Workbook_SheetActivate (à l'activation d'une feuille)
Cet événement se déclenche à chaque changement de feuille :
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
End Sub
Par exemple, affichage du nom de la feuille dans une boîte de dialogue :
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
MsgBox "Nom de la feuille : " & Sh.Name
End Sub
Workbook_SheetBeforeDoubleClick (avant double-clic)
Cet événement se déclenche juste avant un double-clic sur une cellule :
Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
End Sub
Par exemple, coloration d'une cellule double-cliquée en fonction de la feuille :
Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
If Sh.Name = "Feuil1" Then
Target.Interior.Color = RGB(255, 108, 0) 'Couleur orange
Else
Target.Interior.Color = RGB(136, 255, 0) 'Couleur verte
End If
End Sub
Le double-clic peut être annulé en attribuant la valeur True à la variable Cancel.
Workbook_SheetBeforeRightClick (avant clic droit)
Cet événement se déclenche juste avant un clic droit sur une cellule :
Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
End Sub
Workbook_SheetChange (à chaque modification de cellule)
Cet événement se déclenche à chaque modification du contenu d'une cellule :
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
End Sub
Workbook_SheetSelectionChange (à chaque changement de sélection)
Cet événement se déclenche à chaque changement de sélection sur une feuille de calcul :
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
End Sub
Par exemple, coloration de la sélection si A1 est vide :
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
If Range("A1") = "" Then
Target.Interior.Color = RGB(124, 255, 255) 'Bleu clair
End If
End Sub
Workbook_NewSheet (à l'insertion d'une feuille)
Cet événement se déclenche à chaque insertion d'une nouvelle feuille :
Private Sub Workbook_NewSheet(ByVal Sh As Object)
End Sub