Il est de bon ton de se souhaiter la bonne année. Mais vous, et vous seul, pourrez faire en sorte que cette année soit bonne, meilleure que celle qui vient de s'écouler. Apprenez à ne compter que sur vous, car personne n'est plus qualifié que vous-même pour bâtir, réparer ou améliorer votre propre vie. Personne ne fera les choses à votre place. D'ailleurs, tout ce que les autres peuvent faire, c'est souhaiter que vous le fassiez. Et ne croyez pas que tout ceux qui vous entourent vous apporteront des solutions : certains font juste partie de vos problèmes. Transformez vos résolutions en actes, et dans douze mois, retournez-vous et souriez-vous fièrement : C'était long. C'était difficile. Mais ça y est : 2017 était une bonne année, merci Moi.

Les événements de classeur

Evénements de classeur (WorkBook)
Nom d'événement
Se passe quand
Paramètres

ACTIVATION / DESACTIVATION

(Voir également plus bas Workbook_ SheetDeactivate et
Workbook_ SheetActivate)

Workbook_Activate() On clique dans une cellule du classeur ou se trouve cette procédure. Elle ne se déclenche pas si on était dans un autre onglet du même classeur, ni si on était dans un autre programme  
Workbook_Deactivate() Lorsqu'on clique sur un autre classeur (Donc pas sur un autre onglet du même classeur, ni sur une autre application)  
Workbook_WindowActivate(ByVal Wn As Window) Je ne vois pas la différence avec Workbook_Activate ByVal Wn As Window
Représente la fenêtre dans laquelle on vient de cliquer. Comme on vient de l'activer, on n'a pas encore eu le temps de se positionner dans une cellule particulière. Aussi l'instruction :
MsgBox Wn.ActiveCell.AddressLocal
Va donner l'adresse de la cellule qui était active la denière fois qu'on était dans cette fenêtre, et pas la cellule précisément dans laquelle on clique
Workbook_WindowDeactivate(ByVal Wn As Window) Je ne vois pas la différence avec Workbook_Deactivate ByVal Wn As Window
Représente la fenêtre qu'on vient de quitter. l'instruction :
MsgBox Wn.ActiveCell.AddressLocal
Renvoie l'adresse de la dernière cellule qui était active juste avant qu'on quitte la fenêtre.
SEULEMENT DANS LES MACROS COMPLE-MENTAIRES XLA
Workbook_AddinInstall()

Pour comprendre cette procédure il faut parfaitement comprendre le fonctionnement des Macros Complémentaires (XLA).
Cette procédure doit se trouver dans une macro complémentaire .XLA. Elle s'exécutera quand, depuis un autre classeur quelconque, l'utilisateur fera Outils/Macros Complémentaires, cochera la case en regard de la macro complémentaire .XLA qui contient cette procédure AddinInstall, et cliquera sur OK.
On pourrait, de cette façon, afficher une nouvelle barre d'outils qui contient les boutons qui appellent les procédures stockées dans ce .XLA.
Cette procédure ne s'exécute qu'une fois à ce moment : Donc pas à l'ouverture à la mise en mémoire de ce .XLA, mais vraiment lors de son INSTALLATION avec Outils/Macros complémentaires.

 
Workbook_AddinUninstall() S'exécute au même instant que AddinInstall, mais lorsqu'on clique sur OK après avoir retiré la coche.  
Workbook_Open()

Lorsqu'on ouvre un classeur, c'est la première procédure qui s'exécute avant les autres (Activate, etc...)

Il existe une autre façon d'exécuter du code automatiquement à l'ouverture du classeur : Il suffit de mettre dans n'importe quel module une procédure dont le nom est Auto_Open. Cet Auto_Open s'exécutera après Workbook_Open

 
Workbook_BeforeClose(Cancel As Boolean)

Intervient avant de fermer le classeur de quelconque façon. Excel ne fermera pas le classeur tant que la procédure n'est pas terminée.

Il existe une autre façon d'exécuter du code automatiquement à l'ouverture du classeur : Il suffit de mettre dans n'importe quel module une procédure dont le nom est Auto_Close. Cet Auto_Close s'exécutera après Workbook_BeforeClose

Cancel
Si on met dans la procédure
Cancel = True
Alors, il ne sera pas possible de fermer le classeur, que se soit avec la croix, avec Fichier Fremer, Fichier Quitter, ou même Alt-F4. La seule solution restante est CTRL ALT DELETE

Workbook_BeforePrint(Cancel As Boolean) Intervient avant l'envoi à l'imprimante. L'imprimante n'imprime rien tant que cette procédure n'est pas terminée Cancel
Si on met dans la procédure
Cancel = True
Alors, il ne sera pas possible d'imprimer le classeur
Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)

Intervient avant de sauvegarder (Fichier Enregistrer, Enregistrer sous - Avant l'affichage de la boîte de dialogue, lors de CTRL-S ou de clic sur l'icône disquette).
Excel n'enregistre rien et n'affiche pas la boîte de dialogue Enregistrer sous dans que la procédure n'est pas terminée.

SaveAsUI
Contient True si la boîte de dialogue "Enregistrer Sous" doit s'afficher, sinon contient False (Si le fichier a déjà été enregistré, que que la boîte "Enregistrer sous" est inutile).
On ne peut pas forcer l'affichage de cette boîte avec SaveAsUI = True, on peut seulement lire ce paramètre

Cancel
Si on met dans la procédure
Cancel = True
Alors, il ne sera pas possible de sauvegarder le classeur. Si on le modifie et qu'on essaie de quitter, il ne serviva a rien d'essayer de répondre oui à la question "Voulez vous enregistrer les modifications". La question reviendra jusqu'à ce que vous répondiez autre chose que Oui

Workbook_NewSheet(ByVal Sh As Object) Lorsqu'on crée un nouvel onglet ByVal Sh As Object
Le type est un objet générique et pas un Sheet, car il peut s'agir d'une feuille de calcul ou d'un graphique
Comme c'est un objet générique, quand on écrit
MsgBox Sh.
Il n'y a pas d'aide à la saisie, car selon que c'est une feuille ou un graphique, les méthodes et les propriétés diffèrent.
On peut toutefois écrire
MsgBox Sh.Type
Pour avoir un numéro en retour qui dit quel genre d'objet c'est (Voir l'exemple plus bas dans cette page)
Workbook_WindowResize(ByVal Wn As Window)

On redimensionne la fenêtre qui contient le classeur, ou qu'on la mette en plein écran, ou qu'on la rétrécisse, mais pas quand on ferme classeur (c'est WorkBook_BeforeClose dans ce cas.)
Ca s'exécute également quand on était dans un autre programme et qu'on clique sur ce classeur dans la barre des tâches.

ByVal Wn As Window
Représente la fenêtre qu'on vient de redimensionner. Window est un objet qui comporte de nombreuses propriétés, et par ce biais, on peut connaître, entre autre, la taille de la fenêtre, si elle est masquée, si elle est réduite au minimum, etc.
A partir d'ici, tous les événements ont une équivalence dans Sheet :
Workbook_SheetActivate(ByVal Sh As Object) Lorsqu'on clique sur un autre onglet du même classeur, quel qu'il soit.  

On constate que pour tous les événements qui suivent, qui ont donc une équivalence avec les Sheets, nous avons chaque fois le paramètre ByVal Sh As Object qui, à mon avis, précise s'il s'agit d'une feuille de calcul ou d'un graphique...
Les autres paramètres sont strictement identiques à ceux des événements de feuille de même nom. Reportez-vous aux événements de feuille pour de plus amples renseignements

Workbook_SheetDeactivate(ByVal Sh As Object) Lorsqu'on change d'onglet dans le même classeur (Donc pas lorsqu'on clique sur un autre classeur, ou une autre application)
Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean) Survient dès qu'on clique 2 fois dans une cellule (pour l'éditer par exemple).
Cet événement survient juste après WorkSheet_BeforeDoubleClick
Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean) Survient dès qu'on clique dans une cellule ou une plage de cellules avec le bouton droit de la souris (pour faire apparaître le menu contextuel).
Cet événement survient juste après Worksheet_BeforeRightClick
Workbook_SheetCalculate(ByVal Sh As Object) Dès qu'on demande un recalcul de la feuille (F9). Cet événement ne survient jamais si le mode de calcul est automatique (Outils/Options/Calcul/Mode de calcul)
Cet événement survient juste avant Worksheet_Calculate
Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) Dès qu'on crée, modifie ou efface le contenu d'une cellule.
Cet événement survient juste avant Worksheet_Change
Workbook_SheetFollowHyperlink(ByVal Sh As Object, ByVal Target As Hyperlink) Lorsqu'on clique sur un lien hypertexte, par exemple un service Web, on quitte automatiquement Excel pour aller dans le navigateur. Cette procédure s'exécutera juste après Worksheet_FollowHyperlink
Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)

Dès qu'on change la sélection : Déplacement avec la souris, le clavier, Enter, sélection d'une ligne, d'une colonne, de tout le tableau.
On a toutefois le temps de sélectionner une plage de cellule avec la souris (pas avec le clavier) avant que l'événement ne survienne.

Private Sub Workbook_Activate()
MsgBox "Workbook_Activate()"
End Sub


Private Sub Workbook_AddinInstall()
  ' Cet exemple montre comment ajouter un contrôle à la barre d'outils standard lorsque le classeur est installé sous la forme d'une macro complémentaire.
  With Application.CommandBars("Standard").Controls.Add
    .Caption = "The AddIn's menu item"
    .OnAction = "'ThisAddin.xls'!Amacro"
  End With
  
  MsgBox "Workbook_AddinInstall()"
End Sub


Private Sub Workbook_AddinUninstall()
MsgBox "Workbook_AddinUninstall()"
End Sub


Private Sub Workbook_BeforeClose(Cancel As Boolean)
  MsgBox "Workbook_BeforeClose(Cancel As Boolean)"
End Sub


Private Sub Workbook_BeforePrint(Cancel As Boolean)
  MsgBox "Workbook_BeforePrint(Cancel As Boolean)"   
 
' Cet exemple montre comment recalculer toutes les feuilles de calcul du classeur actif avant l'impression de quoi que ce soit.
  For Each wk In Worksheets
    wk.Calculate
  Next
End Sub


Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
  ' Cet exemple montre comment inviter l'utilisateur à répondre par oui ou par non à la question de l'enregistrement du classeur.
  a = MsgBox("Do you really want to save the workbook?", vbYesNo)
  If a = vbNo Then Cancel = True
  MsgBox "Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)"
End Sub


Private Sub Workbook_Deactivate()
  MsgBox "Workbook_Deactivate()"
End Sub


Private Sub Workbook_NewSheet(ByVal Sh As Object)
  MsgBox "Workbook_NewSheet(ByVal Sh As Object)"
  ' Cet exemple place le nouvel onglet, qui peut être une feuille ou un graphique, après le dernier onglet :
  Sh.Move After:= Sheets(Sheets.Count)

  ' Il est possible de savoir s'il s'agit d'une feuille ou d'un graphique que l'on vient de créer :
  MsgBox Sh.Type ' -4167 si c'est une feuille (Ou n'importe quoi d'autre qu'un graphique), et 3 si c'est un graphique
End Sub


Private Sub Workbook_Open()
  MsgBox "Workbook_Open()"
End Sub


Private Sub Workbook_SheetActivate(ByVal Sh As Object)
  MsgBox "Workbook_SheetActivate(ByVal Sh As Object)"
End Sub


Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
  MsgBox "Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)"
End Sub


Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
  MsgBox "Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)"
End Sub


Private Sub Workbook_SheetCalculate(ByVal Sh As Object)
  MsgBox "Workbook_SheetCalculate(ByVal Sh As Object)"
End Sub


Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
  MsgBox "Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)"
End Sub


Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
  MsgBox "Workbook_SheetDeactivate(ByVal Sh As Object)"
End Sub


Private Sub Workbook_SheetFollowHyperlink(ByVal Sh As Object, ByVal Target As Hyperlink)
  MsgBox "Workbook_SheetFollowHyperlink(ByVal Sh As Object, ByVal Target As Hyperlink)"
End Sub


Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
  MsgBox "Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)"
End Sub


Private Sub Workbook_WindowDeactivate(ByVal Wn As Window)
  MsgBox "Workbook_WindowDeactivate(ByVal Wn As Window)"
End Sub


Private Sub Workbook_WindowResize(ByVal Wn As Window)
  MsgBox "Workbook_WindowResize(ByVal Wn As Window)"
End Sub


Private Sub Workbook_WindowActivate(ByVal Wn As Window)
  MsgBox "Workbook_WindowActivate(ByVal Wn As Window)"
End Sub