Recherche…


Syntaxe

  • Module source : [Public] Event [identifier]([argument_list])

  • Handler Module : Dim|Private|Public WithEvents [identifier] As [type]

Remarques

  • Un événement ne peut être que Public . Le modificateur est facultatif car les membres du module de classe (y compris les événements) sont implicitement Public par défaut.

  • Une variable WithEvents peut être Private ou Public , mais pas Friend . Le modificateur est obligatoire car WithEvents n'est pas un mot clé qui déclare une variable, mais une partie de mot clé modificateur de la syntaxe de déclaration de variable. Par conséquent, le mot-clé Dim doit être utilisé si un modificateur d'accès n'est pas présent.

Sources et gestionnaires

Quels sont les événements?

VBA est piloté par les événements : le code VBA s'exécute en réponse aux événements déclenchés par l'application hôte ou par le document hôte - la compréhension des événements est fondamentale pour comprendre VBA.

Les API exposent souvent des objets qui déclenchent un certain nombre d' événements en réponse à divers états. Par exemple, un objet Excel.Application déclenche un événement chaque fois qu'un nouveau classeur est créé, ouvert, activé ou fermé. Ou chaque fois qu'une feuille de calcul est calculée. Ou juste avant qu'un fichier soit enregistré. Ou immédiatement après. Un bouton sur un formulaire déclenche un événement Click lorsque l'utilisateur clique dessus, le formulaire utilisateur génère lui-même un événement juste après son activation et un autre juste avant sa fermeture.

Du point de vue de l'API, les événements sont des points d'extension : le code client peut choisir d'implémenter du code pour gérer ces événements et exécuter du code personnalisé chaque fois que ces événements sont déclenchés. - en gérant l'événement qui est déclenché lorsque la sélection change sur une feuille de calcul.

Un objet qui expose des événements est une source d'événement . Une méthode qui gère un événement est un gestionnaire .


Manieurs

Les modules de document VBA (par exemple ThisDocument , ThisWorkbook , Sheet1 , etc.) et les modules UserForm sont des modules de classe qui implémentent des interfaces spéciales qui exposent un certain nombre d' événements . Vous pouvez parcourir ces interfaces dans la liste déroulante de gauche en haut du volet de code:

Le module ThisWorkbook implémente les événements du classeur

La liste déroulante de droite répertorie les membres de l'interface sélectionnés dans la liste déroulante de gauche:

Les modules de feuille de travail peuvent gérer des événements de feuille de calcul

Le VBE génère automatiquement un stub de gestionnaire d'événements lorsqu'un élément est sélectionné dans la liste de droite ou y navigue s'il existe.

Vous pouvez définir une variable WithEvents portée de WithEvents dans n'importe quel module:

Private WithEvents Foo As Workbook
Private WithEvents Bar As Worksheet

Chaque déclaration WithEvents peut être sélectionnée dans la liste déroulante de gauche. Lorsqu'un événement est sélectionné dans la liste déroulante de droite, le VBE génère un stub de gestionnaire d'événements nommé après l'objet WithEvents et le nom de l'événement, associé à un trait de soulignement:

Private WithEvents Foo As Workbook
Private WithEvents Bar As Worksheet

Private Sub Foo_Open()

End Sub

Private Sub Bar_SelectionChange(ByVal Target As Range)

End Sub

Seuls les types qui exposent au moins un événement peuvent être utilisés avec WithEvents , et les déclarations WithEvents ne peuvent pas être WithEvents une référence WithEvents avec le mot New clé New . Ce code est illégal:

Private WithEvents Foo As New Workbook 'illegal

La référence d'objet doit être Set explicitement; Dans un module de classe, il est souvent Class_Initialize le faire dans le gestionnaire Class_Initialize , car la classe gère alors les événements de cet objet tant que son instance existe.


Sources

Tout module de classe (ou module de document ou formulaire utilisateur) peut être une source d'événement. Utilisez le mot-clé Event pour définir la signature de l'événement dans la section déclarations du module:

Public Event SomethingHappened(ByVal something As String)

La signature de l'événement détermine la façon dont l'événement est déclenché et à quoi les gestionnaires d'événements ressembleront.

Les événements ne peuvent être déclenchés que dans la classe dans laquelle ils sont définis - le code client ne peut les gérer que Les événements sont RaiseEvent avec le mot clé RaiseEvent ; les arguments de l'événement sont fournis à ce stade:

Public Sub DoSomething()
    RaiseEvent SomethingHappened("hello")
End Sub

Sans code qui gère l'événement SomethingHappened , l'exécution de la procédure DoSomething soulèvera toujours l'événement, mais rien ne se passera. En supposant que la source de l'événement est le code ci-dessus dans une classe nommée Something , ce code dans ThisWorkbook afficherait une boîte de message disant "bonjour" à chaque fois que test.DoSomething est appelé:

Private WithEvents test As Something

Private Sub Workbook_Open()
    Set test = New Something
    test.DoSomething
End Sub

Private Sub test_SomethingHappened(ByVal bar As String)
'this procedure runs whenever 'test' raises the 'SomethingHappened' event
    MsgBox bar
End Sub

Transmission de données à la source de l'événement

Utilisation de paramètres transmis par référence

Un événement peut définir un paramètre ByRef destiné à être renvoyé à l'appelant:

Public Event BeforeSomething(ByRef cancel As Boolean)
Public Event AfterSomething()

Public Sub DoSomething()
    Dim cancel As Boolean
    RaiseEvent BeforeSomething(cancel)
    If cancel Then Exit Sub

    'todo: actually do something

    RaiseEvent AfterSomething
End Sub

Si l'événement BeforeSomething a un gestionnaire qui définit son paramètre cancel sur True , alors lorsque l'exécution retourne du gestionnaire, cancel sera True et AfterSomething ne sera jamais AfterSomething .

Private WithEvents foo As Something

Private Sub foo_BeforeSomething(ByRef cancel As Boolean)
    cancel = MsgBox("Cancel?", vbYesNo) = vbYes
End Sub

Private Sub foo_AfterSomething()
    MsgBox "Didn't cancel!"
End Sub

En supposant que la référence d'objet foo soit assignée quelque part, lorsque foo.DoSomething s'exécute, une boîte de message vous demande si vous souhaitez annuler, et une seconde boîte de message indique "n'a pas annulé" uniquement lorsque Non a été sélectionné.


Utiliser des objets mutables

Vous pouvez également transmettre une copie d'un objet mutable ByVal et laisser les gestionnaires modifier les propriétés de cet objet. l'appelant peut alors lire les valeurs de propriété modifiées et agir en conséquence.

'class module ReturnBoolean
Option Explicit
Private encapsulated As Boolean

Public Property Get ReturnValue() As Boolean
'Attribute ReturnValue.VB_UserMemId = 0
    ReturnValue = encapsulated
End Property

Public Property Let ReturnValue(ByVal value As Boolean)
    encapsulated = value
End Property

Combiné au type Variant , il peut être utilisé pour créer des moyens non évidents de renvoyer une valeur à l'appelant:

Public Event SomeEvent(ByVal foo As Variant)

Public Sub DoSomething()
    Dim result As ReturnBoolean
    result = New ReturnBoolean

    RaiseEvent SomeEvent(result)

    If result Then ' If result.ReturnValue Then
        'handler changed the value to True
    Else
        'handler didn't modify the value
    End If
End Sub

Le gestionnaire ressemblerait à ceci:

Private Sub source_SomeEvent(ByVal foo As Variant) 'foo is actually a ReturnBoolean object
    foo = True 'True is actually assigned to foo.ReturnValue, the class' default member
End Sub


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow