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.

Exécutez du code VBA Word lors d'événements tels que Print ou Save

Programmeurs avancés uniquement !

Lorsque vous êtes dans Excel, vous avez la possibilité de créer du code VBA sur presque n'importe quel événement... Ils sont pléthoriques :

Mais dans Word, c'est une autre histoire... Il n'y a pas grand chose à se mettre sous la dent...

Il semblerait que la raison en soit que lorsqu'on travaille dans Word, Word perd un temps non négligeable à rechercher sans arrêt en vain s'il n'existe pas telle ou telle procédure d'événement... Est-ce que le sprogrammeurs d'Excel pensent autrement ? Je n'en sais rien...

Admettons que j'ai besoin de créer un modèle qui exécutera une procédure VBA lorsque j'enregistre et que j'imprime. Ces deux événements, pourtant bien pratiques, sont absents de la liste des événements possibles.

Téléchargez le modèle terminé ici   |   Je me suis inspiré de cette page pour concevoir ce didacticiel

Marche à suivre

  1. Lancez Word
  2. Enregistrez directement le document blanc sous le nom de MODELE : ModeleAvecEvenement.dot
  3. Allez dans l'environnement VBA (Alt-F11)
  4. Créez un nouveau Module de classe (Bouton droit de la souris)
  5. Nommez-le ClasseEvenement (Menu Affichage/Fenêtre propriétés)
  6. Dans son code, copiez-y ceci :
    Public WithEvents ModeleEvenement As Word.Application
  7. Dans la liste déroulante du haut, choisissez "ModeleEvenement"
  8. Dans la liste de droite, nous avons maintenant l'heureuse surprise de constater qu'il y a maintenant plein d'événements intéressants ! Choisissez DocumentBeforeSave
  9. Choisissez ensuite DocumentBeforePrint, et DocumentBeforeClose. Ca crée les événements correspondants :
  10. Rajoutez les codes suivants pour qu'on puisse tester tout à l'heure, quand ce sera fini, la bonne exécution au bon moment de ces événements :
  11. Enregistrez votre modèle par sécurité.
  12. Cliquez deux fois sur "ThisDocument" pour faire apparaître le module correspondant à côté. Choisissez "Document" dans la liste déroulante
  13. Ca fait automatiquement apparaître l'événement prédéfini "New" (Cet événement serait apparu même si on n'avait rien fait de ce qu'on a fait avant : c'est vraiment un des rares événements possibles de Word).
  14. Appelez-y la procédure CreationEvenement
    Private Sub Document_New()
       Set GestionEvenement = New ClasseEvenement
       Set GestionEvenement.ModeleEvenement = Word.Application
    End Sub
  15. Déclarons cette variable GestionEvenement AVANT la procédure elle-même :
    Dim GestionEvenement As ClasseEvenement
    Private Sub Document_New()
      Set GestionEvenement = New ClasseEvenement
      Set GestionEvenement.ModeleEvenement = Word.Application
    End Sub
  16. Choisissez maintenant l'événement Close :
  17. Installez ce code :
    Private Sub Document_Close()
       Set GestionEvenement = Nothing
    End Sub

Voici un petit résumé de tout ce que vous avez dans votre VBA :

Et voilà le travail ! C'est terminé ! Pour voir ce modèle fonctionner, il vous suffit de le fermer, puis d'aller dans le menu Fichier/Nouveau, choisir ModeleAvecEvenement, et d'essayer simplement de l'enregistrer (CTRL-S, ou cliquer sur la disquette), et il affichera

Preuve qu'il aura effectivement bien exécuté le code

Private Sub ModeleEvenement_DocumentBeforeSave(ByVal Doc As Document, SaveAsUI As Boolean, Cancel As Boolean)
  MsgBox "before save"
End Sub

Même commentaire si vous essayez d'imprimer ou de fermer.

Téléchargez le modèle terminé ici   |   Je me suis inspiré de cette page pour concevoir ce didacticiel

---