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 implicitementPublic
par défaut.Une variable
WithEvents
peut êtrePrivate
ouPublic
, mais pasFriend
. Le modificateur est obligatoire carWithEvents
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:
La liste déroulante de droite répertorie les membres de l'interface sélectionnés dans la liste déroulante de gauche:
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