Zoeken…
Syntaxis
Bronmodule :
[Public] Event [identifier]([argument_list])
Handler Module:
Dim|Private|Public WithEvents [identifier] As [type]
Opmerkingen
Een evenement kan alleen
Public
. De modifier is optioneel omdat klassemodule-leden (inclusief evenementen) standaard implicietPublic
.Een
WithEvents
variabele kanPrivate
ofPublic
, maar geenFriend
. De modifier is verplicht omdatWithEvents
geen sleutelwoord is dat een variabele declareert, maar een modifier-sleutelwoord dat deel uitmaakt van de syntaxis van de variabele declaratie. Daarom moet het trefwoordDim
worden gebruikt als er geen toegangsmodificator aanwezig is.
Bronnen en handlers
Wat zijn evenementen?
VBA is gebeurtenisgestuurd : VBA-code wordt uitgevoerd als reactie op gebeurtenissen die door de hosttoepassing of het hostdocument worden opgeworpen - het begrijpen van gebeurtenissen is van fundamenteel belang voor het begrijpen van VBA.
API's leggen vaak objecten bloot die een aantal gebeurtenissen genereren als reactie op verschillende toestanden. Een Excel.Application
object roept bijvoorbeeld een gebeurtenis op wanneer een nieuwe werkmap wordt gemaakt, geopend, geactiveerd of gesloten. Of wanneer een werkblad wordt berekend. Of net voordat een bestand wordt opgeslagen. Of onmiddellijk daarna. Een knop op een formulier roept een Click
gebeurtenis op wanneer de gebruiker erop klikt, het gebruikersformulier roept zelf een gebeurtenis op net nadat deze is geactiveerd, en een andere vlak voordat deze wordt gesloten.
Vanuit API-perspectief zijn evenementen uitbreidingspunten : de klantcode kan ervoor kiezen om code te implementeren die deze gebeurtenissen afhandelt en aangepaste code uitvoeren wanneer deze gebeurtenissen worden geactiveerd: zo kunt u uw aangepaste code automatisch uitvoeren telkens wanneer de selectie op een werkblad wordt gewijzigd - door de gebeurtenis af te handelen die wordt geactiveerd wanneer de selectie op een werkblad wordt gewijzigd.
Een object dat gebeurtenissen blootstelt, is een gebeurtenisbron . Een methode die een gebeurtenis afhandelt, is een handler .
handlers
VBA document modules (bijv ThisDocument
, ThisWorkbook
, Sheet1
, etc.) en UserForm
modules zijn klassenmodules die speciale interfaces die een aantal gebeurtenissen bloot te voeren. U kunt door deze interfaces bladeren in de vervolgkeuzelijst bovenaan het codevenster:
De rechter vervolgkeuzelijst geeft de leden van de interface weer die in de linker vervolgkeuzelijst is geselecteerd:
De VBE genereert automatisch een event-handler-stub wanneer een item wordt geselecteerd in de lijst aan de rechterkant, of navigeert daarheen als de handler bestaat.
U kunt een WithEvents
variabele met modulebereik definiëren in elke module:
Private WithEvents Foo As Workbook
Private WithEvents Bar As Worksheet
Elke WithEvents
aangifte wordt beschikbaar om te selecteren in de vervolgkeuzelijst aan de linkerkant. Wanneer een gebeurtenis in de rechter vervolgkeuzelijst wordt geselecteerd, genereert de VBE een event-handler-stub genoemd naar het WithEvents
object en de naam van de gebeurtenis, samen met een onderstrepingsteken:
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
Alleen typen die ten minste één gebeurtenis weergeven, kunnen worden gebruikt met WithEvents
en aan WithEvents
aangiften kan ter plaatse geen referentie worden toegewezen met het New
trefwoord. Deze code is illegaal:
Private WithEvents Foo As New Workbook 'illegal
De objectverwijzing moet expliciet worden Set
; in een Class_Initialize
is een goede plaats om dat te doen vaak in de Class_Initialize
handler, omdat de klasse dan de gebeurtenissen van dat object afhandelt zolang de instantie bestaat.
bronnen
Elke klassenmodule (of documentmodule of gebruikersformulier) kan een gebeurtenisbron zijn. Gebruik het trefwoord Event
om de handtekening voor de gebeurtenis te definiëren in het declaratiegedeelte van de module:
Public Event SomethingHappened(ByVal something As String)
De handtekening van de gebeurtenis bepaalt hoe de gebeurtenis wordt verhoogd en hoe de gebeurtenishandlers eruit zullen zien.
Evenementen kunnen alleen worden opgevoed binnen de klasse waarin ze zijn gedefinieerd - clientcode kan ze alleen verwerken . Evenementen worden verhoogd met het sleutelwoord RaiseEvent
; de argumenten van de gebeurtenis worden op dat moment gegeven:
Public Sub DoSomething()
RaiseEvent SomethingHappened("hello")
End Sub
Zonder code die de SomethingHappened
gebeurtenis DoSomething
, zal het uitvoeren van de DoSomething
procedure de gebeurtenis nog steeds verhogen, maar er gebeurt niets. Ervan uitgaande dat de gebeurtenisbron de bovenstaande code is in een klasse met de naam Something
, zou deze code in ThisWorkbook
een berichtvenster weergeven met de tekst "hallo" wanneer test.DoSomething
wordt genoemd:
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
Gegevens teruggeven aan de bron van het evenement
Met behulp van parameters die doorgegeven zijn als referentie
Een gebeurtenis kan een ByRef
parameter definiëren die bedoeld is om aan de beller te worden geretourneerd:
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
Als de BeforeSomething
event heeft een handler dat de reeksen haar cancel
parameter True
, dan wanneer de uitvoering rendement van de handler, cancel
zal zijn True
en AfterSomething
zal nooit worden verhoogd.
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
Ervan uitgaande dat de foo
objectreferentie ergens wordt toegewezen, wanneer foo.DoSomething
uitgevoerd, vraagt een berichtvenster of dit moet worden geannuleerd, en een tweede berichtvak zegt alleen "niet geannuleerd" wanneer Nee is geselecteerd.
Gebruik van veranderlijke objecten
U kunt ook een kopie van een veranderlijk object ByVal
doorgeven en handlers de eigenschappen van dat object laten wijzigen; de beller kan vervolgens de gewijzigde eigenschapswaarden lezen en dienovereenkomstig handelen.
'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
Gecombineerd met het Variant
type kan dit worden gebruikt om nogal niet voor de hand liggende manieren te creëren om een waarde aan de beller te retourneren:
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
De handler zou er zo uitzien:
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