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 impliciet Public .

  • Een WithEvents variabele kan Private of Public , maar geen Friend . De modifier is verplicht omdat WithEvents geen sleutelwoord is dat een variabele declareert, maar een modifier-sleutelwoord dat deel uitmaakt van de syntaxis van de variabele declaratie. Daarom moet het trefwoord Dim 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:

Deze werkboekmodule implementeert werkboekgebeurtenissen

De rechter vervolgkeuzelijst geeft de leden van de interface weer die in de linker vervolgkeuzelijst is geselecteerd:

Werkbladmodules kunnen werkbladgebeurtenissen verwerken

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


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow