In het artikel starten van een macro heb ik je laten zien hoe je zelf een macro kunt starten vanuit het visual basic editor scherm en door de macro te koppelen aan een button. Dit zijn de meest gebruikelijke manieren om een macro te starten. Je kunt echter een macro ook laten triggeren door een bepaald event. In dit artikel laat ik je zien welke events je kunt gebruiken om een macro te starten. Ik laat je zien hoe de code er dan uit komt te zien en waar je deze dient te plaatsen in de visual basic editor.
Wat is nu eigenlijk een event?
Met een event bedoelen wij een bepaalde actie binnen Excel die een stuk vba code zou kunnen triggeren. Dit kan bijvoorbeeld zijn het openen van een Excel werkmap of het selecteren van een bepaalde cel. Er zijn heel veel verschillende opties voor een event waar jij een trigger voor een macro aan kunt koppelen. Je moet bij het opzetten van deze trigger opletten dat hij echt alleen aftrapt, zodra het nodig is. De performance van de sheet wordt namelijk erg beïnvloed op het moment dat er continu onnodig een script loopt op de achtergrond.
Welke soorten events zijn er om een macro te starten
Er zijn verschillende soorten events die gekoppeld zijn aan objecten binnen Excel.
Events voor werkmappen
Dit zijn triggers die gekoppeld zijn aan acties op de gehele werkmap. Een voorbeeld hiervan is een macro die start als een Excel sheet opgestart wordt.
Indien je een macro wilt laten starten op het moment dat je een excel sheet opent dan dien je de onderstaande code te schrijven. Deze code plaats jeniet in een module zoals je gewend bent te doen. Deze code plaats je binnen ‘Thisworkbook’. Als je nu de Excel sheet opslaat (uiteraard met een extensie xlsm of xlsb) en je opent deze opnieuw dan zie je netjes een msgbox verschijnen.
Sub workbook_open()
    MsgBox "Starten bij openen workbook"
End Sub
Wil je een compleet overzicht met alle events die beschikbaar zijn voor een werkmap? Klik dan in de visual basic editor op het Excel object ‘Thisworkbook’. In het rechter dropdown menu kun je nu een lijst vinden met alle mogelijke events voor een werkmap.

Events voor werkbladen
Events voor werkbladen kunnen bijvoorbeeld een verandering van de inhoud van een cel zijn of een selectie van een bepaalde cel die een macro triggert. Je kunt net als voor de werkmap alle opties ophalen. Alleen selecteer je in dit geval je werkblad ( in het bovenstaande screenshot bijvoorbeeld ‘Blad1’) i.p.v. ‘Thisworkbook’.
Laten we als voorbeeld nu een macro starten door het wijzigen van een waarde in een bepaalde cel. Wat in de code staat beschreven is dat op het moment dat je een change uitvoert op cel ‘A1’ dat de waarde van deze cel automatisch weer aangepast wordt naar “waarde gevuld door een change event”. Aan het begin van deze code plaatsen we ‘Application.EnableEvents = False’. Dit zorgt ervoor dat tijdens het runnen van de code events niet nogmaals getriggerd kunnen worden. Wat je namelijk doet in de code is cel A1 ook weer wijzigen. Als je de events dan tijdens de code niet uitzet dan resulteert dit in een oneindige loop en dan kan in het ergste geval je Excel applicatie crashen. Aan het einde van de code zetten we de events weer aan door ‘Application.EnableEvents = True’ te plaatsen
Private Sub Worksheet_Change(ByVal Target As Range)
    Application.EnableEvents = False
    If Not Intersect(Target, Range("A1")) Is Nothing Then
        Target.Value = "waarde gevuld door een change event"
    End If
    Application.EnableEvents = True
End Sub
Events gekoppeld aan de Excel applicatie
Er zijn 57 verschillende applicatie events die je kunt gebruiken. Welke 57 dat zijn kun je bekijken door een Klassenmodule in te voegen via de visual basic editor. Bovenin de code plaats je dan de volgende regel ‘Public WithEvents ExcelApplicatieEvents As Application’. Door als object nu ExcelApplicatieEvents te kiezen bovenin krijg je nu rechts de events te zien die je kunt gebruiken.

Naast events die getriggerd worden door acties op de Excel applicatie, werkmap en werkblak zijn er nog een aantal andere categorieën. Er zijn Userform events. Dat zijn zoals de naam al zegt stukjes code die afgespeeld worden zodra er contact is met een opgezette Userform. Binnenkort zal ik een artikel schrijven over het gebruik van Userforms waar ik dit in detail zal toelichten.
Verder zijn er nog chart events (events getriggerd door het activeren of wijzigen van een chart (grafiek). Dan is er nog het Ontime event waarbij je met behulp van ‘Application.OnTime’ een actie kunt laten uitvoeren na een bepaald tijdsbestek. Laten we als voorbeeld nemen dat 5 seconden na het openen van een Excel bestand wij de gebruiker een bericht willen sturen om deze welkom te heten in de sheet. Deze code schrijf je dan in ‘Thisworkbook’.
Sub workbook_open()
Application.OnTime Now + TimeValue("00:00:03"), "WelkomstBericht"
End Sub
En de onderstaande sub genaamd ‘Welkomstbericht’ (die je aanroept) plaats je dan in een module
Sub WelkomstBericht()
    MsgBox "Hoi! Wat leuk dat je even komt kijken."
End Sub
Tenslotte is er nog de Onkey event die precies hetzelfde werkt als de ontime event. Hier maak je alleen gebruik van ‘Application.OnKey’ in plaats van ‘Application.OnTime’. Je kunt dan bijvoorbeeld het triggeren van een sub verbinden met een bepaalde toets op je toetsenbord.
Private Sub Workbook_Open()
    Application.OnKey "C", "TestOnkeyEvent"
End Sub
Sub TestOnkeyEvent()
    MsgBox "Hoi! Wat leuk dat je even komt kijken."
End Sub
Ik hoop dat je nu een duidelijk beeld hebt gekregen hoe je een macro kunt starten met events. Mocht je toch nog een vraag hebben. Laat het weten in de reacties.
							
			
goedemiddag,
ik heb een excel datalijst met namen, mailadressen en geboortedagen. Ik wil graag geautomatiseerd een mail versturen naar een jarige. Hoe pak ik dat aan?
Frits
Hoi Frits,
Je begon in ieder geval al op de juiste pagina ;). Je plaatst de VBA code die hiervoor nodig is in een Workbook_open change event in het Excel bestand met de datalijst.
Je kunt een FOR loop gebruiken om door de Excel lijst heen te gaan.
Vervolgens gebruik je een if statement om de geboortedatum die op de betreffende regel staat te vergelijken met de huidige dag.
Indien aan deze voorwaarde voldaan wordt laat je de macro een outlook bericht aanmaken of meteen verzenden. Hoe je de mail aanmaakt vind je HIER.
Het enige waar je nu nog voor moet zorgen is dat het Excel bestand met de datalijst en je code elke dag geopend wordt.
Je zou dit volledig kunnen automatiseren door de sheet dagelijks te laten openen met behulp van de taakplanner op een moment dat jij je pc altijd aan hebt staan.
Indien je voor deze oplossing kiest zou ik ook toevoegen dat je workbook meteen automatisch weer afgesloten wordt nadat de code klaar is. Let hierbij wel op dat
je alleen de Excel applicatie afsluit als de datalijst het enige Excel workbook is dat je open hebt staan. Anders zou ik alleen het workbook afsluiten.
Dit kun je doen door een check ( gebruik hiervoor wederom een if statement) te doen op het aantal worbooks dat open staat (workbooks.count).
Ik denk dat je nu een aardig stukje in de richting van je oplossing bent gestuurd.
Mvg,
Martin