Events van besturingselementen op een werkblad verwerken middels een klassenmodule.

Pagina's in dit artikel

  1. Voorbereiding
  2. Klassenmodule
  3. Verbinden
  4. Conclusie

De elementen aan de klassenmodule knopen

Nu de event sub klaar is, is het tijd om de elementen op het werkblad aan de klassenmodule te verbinden.

Allereerst moeten wat code in de klassenmodule worden geplaatst die het object (lees het element) zal ontvangen waarnaar de klassenmodule gaat "luisteren" (dit zal worden gedaan door een initialisatie routine die verderop wordt getoond):

Public Property Set Control(obtNew As MSForms.OptionButton)
    Set mobtOption = obtNew
End Property

Nu moeten er  zoveel instanties van de klassenmodule worden gemaakt als er elementen zijn en elk element moet worden opgehangen aan zijn of haar eigen instantie van de klassenmodule. Voeg een normale module toe aan het project.
Er zal een Collection variabele worden gebruikt om de instanties van de klassenmodule in op te slaan:

Dim mcolEvents As Collection

Vervolgens moeten alle OLEObjects doorlopen worden en worden de Optionbutton elementen met hun instantie van de klassenmodule verbonden. Hier is de code van de hele module:

Option Explicit

Dim mcolEvents As Collection

Sub InitializeEvents()
    Dim obtOptionbutton As OLEObject
    Dim osh As Worksheet
    Dim clsEvents As clsObtHandler
    Set osh = ThisWorkbook.Worksheets(1)
    If mcolEvents Is Nothing Then
        Set mcolEvents = New Collection
    End If
    'Loop door alle controls
    For Each obtOptionbutton In osh.OLEObjects
        If TypeName(obtOptionbutton.Object) = "OptionButton" Then
            'Maak een nieuwe instantie van de event handler klasse
            Set clsEvents = New clsObtHandler
            'Laat de events van de text box verwerken
            Set clsEvents.Control = obtOptionbutton.Object
            'Voeg de event handler instantie toe aan de collectie,
            'zodat deze gedurende de levensduur van ons bestand actief blijft
            mcolEvents.Add clsEvents
        End If
    Next
End Sub

Sub TerminateEvents()
    'Here the collection of classes is destroyed so memory will be freed up:
    Set mcolEvents = Nothing
End Sub

De laatste stap is ervoor zorgen dat de initialisatie routine wordt uitgevoerd wanneer het bestand wordt geopend, bijvoorbeeld door middel van het Workbook_Open event (in de ThisWorkbook module):

Option Explicit

Private Sub Workbook_Open()
    InitializeEvents
End Sub

Afsluiten en opruimen

Als het bestand wordt gesloten, of wanneer de controls niet meer op events moeten reageren, dan moet de klasse haar objecten opruimen bij beëindigen (in de klasse module):

Private Sub Class_Terminate()
    Set mobtOption = Nothing
End Sub

Deze code zorgt ervoor dat het geheugen dat werd ingenomen door de collectie van klasses, weer wordt vrijgemaakt:

(in een normale module)

Sub TerminateEvents()
    'Hier wordt de collectie van event klassen vernietigd
    'zodat het geheugen wordt vrijgegeven:

    Set mcolEvents = Nothing
End Sub

Wanneer door bovenstaande subroutine gestapt wordt, dan zal de Class_Terminate routine worden uitgevoerd voor elke lid van de collectie (zoals opgebouwd in de routine "InitialiseEvents"), waarmee alle object variabelen dus automatisch verwijderd worden uit het geheugen. Uiteraard moet deze routine worden aangeroepen wanneer het bestand gesloten wordt, dus moet de volgende code in de ThisWorkbook module worden geplaatst::

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    TerminateEvents
End Sub