VBA voor Doe het Zelvers is een reeks artikelen, bedoelt voor mensen die met VBA in Excel aan de slag willen om taken te automatiseren of om deze toegankelijk te maken voor gebruikers met weinig Excel kennis. VBA is een volwaardige programmeertaal met een woordenschat en een zinsopbouw (syntaxis). Om deze goed te kunnen leren wordt het aangeraden om hierover boeken te lezen. Bijvoorbeeld uit deze willekeurige selectie.

Vorige aflevering

In de vorige aflevering werd besproken hoe een UserForm kan worden ingezet om tekstinvoer eenvoudiger te maken. Daarnaast werden er verschillende functies besproken om tekst te manipuleren.

In deze aflevering

Neem ik de Event of Gebeurtenis Macro onder de loep met verschillende voorbeelden welke ook in de bijlage worden uitgewerkt. De bijlage bevat onder andere een simpele klok en een manier om ongewenst knippen en plakken te tegen te gaan.

Event Macro

De Event of Gebeurtenis Macro is een macro die reageert op een bepaalde gebeurtenis van het werkboek, een werkblad of een besturingselement. Elk van deze objecten heeft een reeks voor-gedefinieerde Event Macro’s. Deze zijn terug te vinden in de Object Browser (3).  
april 2014: Doubleclick event..jpg

Na selectie van het betreffende onderdeel links in de Project Verkenner (1), kan bij (2) het object zelf of één van de leden daarvan worden geselecteerd. Bij (3) kan dan één van de bijbehorende Event Macro’s worden geselecteerd. De dropdown-lijst geeft overzichtelijk weer welke Event Macro’s er beschikbaar zijn. Dit kan verschillen per object. Een Event Macro is altijd een Private Sub. Dat wil zeggen dat de macro alleen geldig is voor het object waar de macro bij hoort. De Event kan in gang gezet (getriggerd) worden door de gebruiker. Bijvoorbeeld door het openen van het werkboek, een ander werkblad selecteren, klikken op een knop, drukken op sneltoetsen enzovoorts. Een Event kan ook door de code zelf worden getriggerd. Bij het schrijven van Event Macro’s zijn er onder meer twee belangrijke zaken om rekening mee te houden:

-       Tekst invoer blokkeert Event Macro’s

Bij het invoeren van tekst in een cel worden alle Events geblokkeerd tot de tekst is ingevoerd. Dit is dus zolang het knipperende dunne cursor streepje zichtbaar is. Pas als de cel wordt verlaten kan er weer een Event worden afgevuurd.

-       Events kunnen ongewenste “loops” veroorzaken.

Een Event kan weer een ander Event triggeren. Dat kan ongewenste en oncontroleerbare sprongen opleveren. Excel kan zelfs in een ononderbroken lus terecht komen, welke dan alleen nog onderbroken kan worden met de Break toets. Dit probleem kan vooral optreden bij gebruik van het Change Event. Hier kan mogelijk de ene verandering de volgende weer uitlokken, die op haar beurt weer de volgende uitlokt enz. enz. Het is daarom aan te bevelen om het Change Event zo min mogelijk te gebruiken.

Soms zijn er toch goede redenen om het Change Event wel te gebruiken, of zijn er andere reden waarbij het gewenst is om het triggeren van Event Macro’s tegen te gaan. Dat kan dan als volgt:      

       Application.EnableEvents = False

Door de waarde True mee te geven worden de Events weer aangezet. Dit gebeurt over het algemeen aan het eind van de routine. Bij een onverwachte fout wordt de routine voortijdig verlaten. De Events blijven dan uitgeschakeld, met als gevolg dat er niet meer op gebruikersinvoer wordt gereageerd. Het is daarom aan te bevelen routines waarin de Events worden uitgezet altijd te voorzien van foutafhandeling en daarin de Events weer aan te zetten. Zo kan worden voorkomen dat een fout een complete stop van de werking van het werkboek veroorzaakt. De routine kan bijvoorbeeld als volgt worden opgebouwd:
april 2014: Change Event..png 
Met het Change Event kan er bijvoorbeeld gebruikersinvoer worden opgevangen en gecontroleerd worden op juistheid. Met de volgende routine wordt er gecontroleerd of de invoer een datum is:

april 2014: Datum Check..png
In dit geval is hetzelfde te bereiken met gegevensvalidatie. Dit heeft sterk de voorkeur. In specifieke gevallen kan bovenstaande methode echter wel bruikbare mogelijkheden bieden die anders mogelijk niet zijn te realiseren.

Voorbeelden

Hieronder volgen nog enkele voorbeelden van het gebruik van Events.

Melding bij het openen van het werkboek:

Hiermee wordt bij het openen van het werkboek een messagebox geopend waarin de gebruiker wordt verwelkomd.

april 2014: WorkbookOpen..png

Rechtsklik-menu wegvangen:

april 2014: disable rightclick..png

Deze routine vangt alle rechtsklikken op in het hele werkboek. Indien gewenst kan dat ook per blad, door het Worksheet Event te gebruiken:

april 2014: disable rightclick per blad
Dit is een voorbeeld van een Event welke voor het hele werkboek kan gelden of alleen specifiek per werkblad. Deze keuze is er voor een aantal Events.

Opslaan als voorkomen:

Soms het handig om te voorkomen dat gebruikers het werkboek opslaan onder een andere naam of op een andere locatie. Dat kan worden tegen gegaan door in de het BeforeSave Event na te gaan of er voor “Opslaan Als” is gekozen en dan dit vervolgens als volgt te cancelen:

april 2014: cancel SaveAs..png

Met sneltoetsen:

Het indrukken van sneltoetsen is ook een gebeurtenis die kan worden afgevangen. De druk op een toetscombinatie start dan een gespecificeerde macro. Hiervoor is de OnKey methode. Zie de VBA help voor de mogelijkheden met de diverse toetscombinaties.

Hieronder volgt een voorbeeld waarmee kopiëren en plakken kan worden tegengegaan. Soms is dat noodzakelijk om bijvoorbeeld te voorkomen dat de opmaak verloren gaat door een kopieer actie.

april 2014: NoCopyPaste..png
Bij het openen van het werkboek dient hiervoor de OnKey ingesteld te worden op de volgende manier:

april 2014: sneltoetsen instellen..pngCopy Paste is natuurlijk op verschillende manieren mogelijk. De volgende procedure zorgt ervoor dat ook deze manieren niet te gebruiken zijn:

april 2014: disable CutCopy..png
Deze methode is eventueel te combineren met (Public) variabelen die het mogelijk maken om kopiëren op de gewenste momenten wél toe te staan. Dit wordt aan de eigen fantasie overgelaten.

Werkboek sluiten:

Het is altijd netjes om Excel zo achter te laten dat er niets is veranderd voor de gebruiker als hij ons werkboek heeft afgesloten. Dit is nu extra belangrijk, omdat de OnKey Methode op bepaalde momenten de routine ook kan starten als het werkboek al gesloten is. Dat opent dan weer ons werkboek. Dit tot grote (en vast niet blijde) verbazing van de gebruiker die iets probeert te kopiëren in een heel ander werkboek. Gebruik hiervoor het BeforeClose Event. Reset hierin de sneltoetsen als volgt:

april 2014: beforeClose..png

Op tijd:

Een enigszins vergelijkbare methode is OnTime. Hiermee wordt op de ingestelde tijd een gespecificeerde procedure gestart. Daarmee kan bijvoorbeeld het werkboek ieder kwartier automatisch opgeslagen worden.

Ook aan deze methode zitten een paar mitsen en maren.

Deze methode is hierdoor niet geschikt voor echt tijd kritische toepassingen. Ook al omdat de minimum instelbare tijd 1 hele seconde is. Met deze beperkingen in het achterhoofd zijn er toch wel bruikbare toepassingen mogelijk. De tijd instellen is erg gemakkelijk met de Functie TimeValue. Bijvoorbeeld 3 uur ’s middags: TimeValue("15:00:00"). Wanneer je om die tijd de procedure "KoffieTijd" wil starten gebruik je het volgende:

       Application.OnTime TimeValue("15:00:00"), “KoffieTijd”

Voor een timer is natuurlijk nodig dat er iedere seconde iets gebeurt. Dat is te bereiken met een procedure waar steeds een seconde na “nu” naar toe wordt gesprongen door middel van een loop:

april 2014: Counter basis..png
Heel simpel dus. Té simpel, want er gebeurt niets. Behalve dat VBA er iedere seconde naar toe springt. Een klok is met dit principe wel heel gemakkelijk te creëren. Namelijk door op het werkblad NU() als functie te zetten. Met de juiste cel-opmaak krijg je dan een klok. Deze gaat lopen door de betreffende cel elke seconde te laten herberekenen.

april 2014: Counter simpel..png
Een regeltje extra is daarvoor voldoende. De procedure moet wel worden gestart bij het openen van het werkboek:

april 2014: WorkbookOpen compleet..png
De OnTIme Methode moet altijd worden afgesloten wanneer er geen gebruik meer van wordt gemaakt. Dit moet ook als het werkboek gesloten wordt en kan dan als volgt:

april 2014: beforeClose..png

Met het afsluiten van het werkboek eindig ik ook deze aflevering.

Samenvattend:

In deze aflevering zijn de Event Macro’s besproken met verschillende voorbeelden. Ook werd de OnKey methode uitgelegd en de OnTime methode geïntroduceerd aan de hand van een simpele klok. Dit wordt gedemonstreerd de bijlage, die hier is te downloaden (Zie de eerste aflevering voor het in gebruik nemen van een werkboek met macro’s. Deze kan eventueel worden gedownload in de handleidingsectie).

Volgende aflevering

De volgende keer wordt de OnTIme methode verder besproken met een paar mogelijkheden om deze in te zetten als een timer. Ook wordt een methode gegeven om met behulp van een klein beetje VBA en voorwaardelijke opmaak de geselecteerde rij en kolom zichtbaar te maken. Verder wordt de conversie van werkboeken van oudere (2003 en eerder) Excel versies naar de nieuwere Excelversies besproken. Hier treden nogal eens problemen bij op die ook behandeld zullen worden.