Si vous voulez écrire des macros VBA vraiment intelligentes, il est bon de savoir que vous avez accès à de très nombreux  écouteurs d'événements de document (actions déclenchées en fonction d'un certain objet ou de l'état du document ou du changement apporté à celui-ci). Dans l'exemple qui suit, je vais vous montrer au travers des codes comment éviter le code « Shapes will be deleted in a document by the User » (les formes seront supprimées dans un document par l'utilisateur).

Ce code peut être directement dans n'importe projet de  document VBA (VBAProject "YourFileName"->CorelDRAW X5/X6 Objects>ThisDocument). Si vous voulez réutiliser le code dans vos macros autocodés, vous pouvez remplacer la variable globale "Document" par "GlobalMacroStorage". Veillez à ne pas utiliser ce code dans le projet VBA prédéfini "GlobalMacros", car il pourrait déstabiliser votre application Corel.

 Toutes les variables doivent être déclarées explicitement :
Option Explicit
Ce code déclare la variable globale "CurrentDoc" .

Comme nous voulons pouvoir activer ou désactiver l'écouteur d'événement sur notre décision, il faudra que cette variable puisse l'activer ou le désactiver avec le document actif; sinon nous pourrions également utiliser la variable prédéclarée "Document", mais cela ferait exécuter notre code de façon permanente.

Private WithEvents CurrentDoc As Document
Cette variable est utile en ce qu'elle permet d'éviter le déclenchement d'événement constant comme c'est le cas avec "CurrentDoc_ShapeMove": Dim eventHasAlreadyFired As Boolean

La variable globale "Document" est utilisée pour initialiser notre écoute d'événements et elle est prédéclaré parce que ce code VBA est attaché au document et enregistré avec ce dernier. Lorsque vous élaborez vous-même votre code, vous avez accès plutôt à la variable "GlobalMacroStorage".

L'événement spécifique (dans le cas de ce document "Open") est attaché à la variable avec un trait de soulignement.
Private Sub Document_Open()

Ainsi, lorsque le document est ouvert et que l'utilisateur accepte d'exécuter le code macro joint, la variable "CurrentDoc " sera définie et l'écouteur d'événement sera initialisé :
   bindEvents
End Sub

Configurez la variable CurrentDoc suivant cette procédure pour activer l'écoute d'événement sur ​"CurrentDoc":
Sub bindEvents()

pour aller chercher le document actif, nous avons réellement besoin de l'activer :
    ActiveDocument.Activate

Définissez "CurrentDoc" SEULEMENT si ce n'est pas déjà fait :

If CurrentDoc Is Nothing Then: Set CurrentDoc = ActiveDocument
End Sub

L'écoute d'événement sera arrêtée par cette procédure parce qu'elle désarme la variable globale "CurrentDoc".
Sub unbindEvents()

désarmez la variable SEULEMENT si elle est explicitement définie :
    If Not CurrentDoc Is Nothing Then: Set CurrentDoc = Nothing
End Sub

Cette procédure sera exécutée lorsque l'utilisateur ferme le document.
Elle peut s'utiliser parfaitement pour libérer notre écoute d'événement écoute sur "CurrentDoc" avec "unbindEvents"
Private Sub Document_QueryClose(Cancel As Boolean)
Libérez l'écoute d'événement SEULEMENT si l'utilisateur ferme RÉELLEMENT le document. S'il annule la fermeture du document, alors l'écoute d'événement va se poursuivre.
    If Cancel = False Then: unbindEvents
End Sub

Time to act (le temps d'agir) : cette procédure est exécutée lorsque l'utilisateur tente de supprimer n'importe quelle forme dans le document.
Private Sub CurrentDoc_ShapeDelete(ByVal Count As Long)

Cette action n'est à exécuter qu'une seule fois :
    If eventHasAlreadyFired = True Then: Exit Sub
Écrit dans la fenêtre immédiate le nombre de formes qu'on a tenté de supprimer :
    Debug.Print Count & " Shape/s deleted."

Affiche un message contextuel à l'intention de l'utilisateur :
    MsgBox "You are not allowed to delete any Shape in this Document!", vbExclamation

La/les forme(s) a/ont été supprimée(s), donc que nous "remontons le temps" grâce à cette ligne :
    CurrentDoc.Undo 1

Définissez notre "Flag" pour dire que cet événement a déjà été déclenché. Si vous voulez observer en permanence l'événement "ShapeDelete", vous pouvez omettre cette ligne.
    eventHasAlreadyFired = True
End Sub

Conseil de Maurice Beumers, Maître CorelDRAW, graphiste et illustrateur

Anonymous