Beginnen met VBA - 1

Inleiding

Wat is VBA?

VBA staat voor Visual Basic for Applications. Visual Basic is een programmeertaal op zich. VBA kan worden gezien als een uitbreiding van Visual Basic om specifieke taken uit te voeren in de Microsoft Office toepassingen. Een toepassing wordt ook wel een 'oplossing' genoemd of een 'applicatie'.

Omdat in elke Office toepassing specifieke taken kunnen worden uitgevoerd, heeft elke Office toepassing z'n eigen specifieke bibliotheken. Bibliotheken bevatten diverse onderdelen zoals objecten, methoden, eigenschappen etc. Wat je in Word kan, kan je niet in Outlook. Echter, met VBA kunnen we de toepassingen wel met elkaar 'laten praten', maar daarover later meer. Laten we eerst eens kijken waar en hoe we programmacode kunnen schrijven.

Een module opslaan

Cursussen: standaardmodule invoegen

Om programmacode te schrijven hebben we een module nodig. In dit geval gaan we die ook opslaan. Elke Microsoft Office toepassing beschikt over VBA, maar in deze les gebruiken we Microsoft Word.

  • Start Microsoft Word.
  • Maak een nieuw bestand en sla het onder een willekeurige naam op. Kies in het vak Opslaan als één van de twee bestandstypen:
    • Word-document met ingeschakelde macro's (*.docm)
    • Word-sjabloon met ingeschakelde macro's (*.dotm)
  • Druk op Alt+F11. De VBE (Visual Basic Editor) wordt geopend.
  • Als de Projectverkenner niet wordt weergegeven, ga dan naar menu Beeld > Projectverkenner of druk op Ctrl+R.
  • Selecteer in de Projectverkenner het item dat je document of sjabloon vertegenwoordigt. Het begint met het woord 'Project'.
  • Ga naar menu Invoegen > Module. Er wordt nu een mapje Modules aangemaakt waarin een module wordt ingevoegd.
  • Je kan de naam van de module wijzigen. Selecteer in de Projectverkenner de module en druk op F4. Het venster Eigenschappen verschijnt waarin je de naam kunt aanpassen.

Zo blijft de module bij het document of sjabloon. Wil je later verder werken in de module, dan weet je die nu te vinden.

Opmerking Als je code voor derden gaat schrijven is het niet verstandig code in normal.dotm op te slaan en hen dat bestand te geven. De reden is eenvoudig: mensen werken met hun eigen normal.dotm, daar kan je maar beter vanaf blijven. Voor jezelf maakt het voor nu niet uit waar je de code in opslaat. We zijn immers nog maar wat aan het spelen.

Extra info

De module die we zojuist hebben opgeslagen, is een standaardmodule. In een standaardmodule plaats je 'algemene programmacode' oftwel code die je globaal gebruikt. Voor nu concentreren we ons op dit type module, want we willen code schrijven die we globaal kunnen inzetten. We willen de dingen die we maken, vaker kunnen gebruiken.

Liever in Access? De standaardmodule kan je ook in Access maken als je wilt. Voor onze start maakt het niet uit. We gaan immers niet een project opzetten. Ga in Access naar het tabblad Maken > groep Macro's en code > Module.

Je eerste procedure Sub

  • De invoegpositie staat in de zojuist gemaakte module. Bovenaan zal waarschijnlijk Option Explicit worden weergegeven. Laat maar staan, is nu niet van belang.
  • Onder Option Explicit gaan we onze eerste procedure schrijven. Typ Sub, gevolgd door een spatie en dan MijnProc. Druk op Enter.
  • VBA weet nu dat dit het begin van een procedure is en zal afsluiten door een lege regel en een regel met End Sub toe te voegen. Yippieieie, je eerste procedure is een feit. Het ziet er zo uit:

Sub MijnProc()

    

End Sub

Echter, in de procedure staat nog niets. Er zijn nog geen 'statements' gedeclareerd. Een statement is gewoon een coderegel. Hiermee vertellen we de procedure wat er moet gebeuren. In het volgende voorbeeld hebben we een regel toegevoegd die gebruik maakt van de ingebouwde VBA functie MsgBox. Het is goed dat je dit voor deze keer zelf doet en niet de code kopieert.

Zet de invoegpositie binnen de procedure en druk op de Tab-toets zodat er een inspringing plaatsvind. Voor de code zelf maakt dit niets uit, maar het is belangrijk dat de code ook goed leesbaar is als er veel meer coderegels zijn toegevoegd. Dit zal je straks vanzelf zien en begrijpen.

Nadat je MsgBox hebt getypt, volg je met een spatie. Nu zie je dat er een popup schermpje verschijnt met wat informatie. De informatie die hierin wordt weergegeven is de syntaxis die hoort bij de VBA functie MsgBox. Delen in de syntaxis zijn gescheiden door een komma. Elke komma geeft de plaats van een argument (oftewel parameter) aan die aan de functie MsgBox kan worden meegegeven. Het eerste argument is Prompt. Het staat voor de vraagstelling of het bericht dat we willen meegeven. Typ wat in het voorbeeld hieronder staat. Nadat je het argument Prompt hebt ingegeven typ je een komma. Er verschijnt nu een lijst waaruit je een waarde kan kiezen. Type vbi en vbInformation wordt geselecteerd (dit is een vb-constante wat we zeker verderop in de lessen zullen behandelen). Druk op de Tab-toets ende geselecteerde waarde wordt overgenomen. Ga door zodat het er zo uitziet:

Sub MijnProc()

    MsgBox "Hallo wereld", vbInformation, "De titel"

End Sub

We hebben nu een echte procedure gemaakt. Plaats de invoegpositie binnen de procedure en druk op F5.

Opmerking Misschien ervaar je dat er veel wordt verteld, maar als je dingen goed begrijpt heb je daar straks profeit hebt. Als je dingen begrijpt wordt het leuker.

Argumenten doorgeven

Binnen een programma moet de procedure natuurlijk niet met F5 worden aangeroepen. Dan gebeurt dat via een andere procedure, bijvoorbeeld wanneer een gebruiker op een knop klikt. Plaats de volgende procedure eveneens in de module die je zojuist hebt gemaakt. De naam van de procedure is alleen van betekenis voor dit voorbeeld, verder niet. Plaats de invoegpositie binnen de procedure en druk op F5. Je ziet nu dat MijnProc van buiten MijnProc wordt aangeroepen (dat kan dus vanuit meerdere locaties). Hééé, dat betekent dus dat we MijnProc steeds kunnen hergebruiken... Dit is een heel mooi en krachtig aspect waar we nog vaak op terug zullen komen. Want dit vind je alleen bij echte programmeurs.

Sub CallMijnProc()

    MijnProc

End Sub

In MijnProc hebben we aan MsgBox argumenten doorgegeven, weet je nog? Die syntaxis vertelde ons over welke argumenten MsgBox beschikte. Nu gaan we leren dat we ook argumenten kunnen doorgeven aan de procedure die we zelf hebben gemaakt. Dat werkt namelijk allemaal op dezelfde wijze. Bij MsgBox konden we zelf bepalen wat de waarde van die argumenten was. Argumenten zijn dus variabel in te stellen. En dat is mooi, want zo kunnen we procedures op verschillende manieren laten werken.

Aan MijnProc kennen we op dezelfde wijze een argument toe zoals dat ook aan MsgBox is toegekend, maar dan met de naam strMsg. Zorg dat beide procedures er uit komen te zien zoals in het volgende voorbeeld.

Als je dit gedaan hebt, plaats dan de invoegpositie in CallMijnProc en druk op F5. Je zal zien dat de waarde van strMsg door MijnProc wordt weergegeven. We hebben nu een waarde van de ene naar de andere procedure doorgegeven en ze zo met elkaar verweven.

Sub CallMijnProc()

    MijnProc "Goedemorgen wereld"

End Sub

Sub MijnProc(strMsg As String)

    MsgBox strMsg, vbInformation, "De titel"

End Sub

Oorspronkelijk hadden we MijnProc zonder enige vorm van flexibiliteit gemaakt. Daar hebben we al iets aan kunnen verbeteren. Maar nou zitten we nog met die verrekte titel in onze maag. Die wil je niet steeds opnieuw ingeven (tenzij je niets belangrijkers te doen hebt). Want als je straks duizenden berichtvensters moet weergeven... Trouwens, bij een beetje logisch en simpel nadenken komen we er al gauw achter dat we het beste een algemene titel kunnen kiezen die altijd wordt gebruikt. Dan doen we het netjes, we zjin consistent én we zijn verlost van een hoop werk.

In de volgende rubriek zullen we leren dat er mogelijkheden zijn om waarden terug te geven. Zo kunnen we dingen hergebruiken wat ons heel veel werk scheelt.

Prefix gebruiken bij argumentnamen Het is geen wet, maar het is handig om de namen van argumenten met een bijhorende prefix aan te duiden. In dit geval was dat str (strMsg) hetgeen erop duid dat het argument van een type String is. Het is aan jou hoe je de prefixen hanteert en zoals gezegd is het geen verplichting.

Threads Programa's bestaan uit 'threads'. In het vorige voorbeeld hadden we ook 'een draadje' verbonden van de ene procedure naar de andere. De onderdelen van een coderegel kan je zien als de woorden van een zin. Zinnen maken alinea's, alinea's vormen rubrieken, hoofdstukken en uiteindelijk een boek. Een boek moet goed zijn ingedeeld en naar onderwerp gerangschikt. Op dezelfde wijze bouwen we een programma: onze coderegels vormen procedures. Procedures vormen modules die we indelen op onderwerp. Die modules kunnen we (her)gebruiken in programma's.

Je eerste procedure Function

MijnProc is een procedure Sub. Nu gaan we een procedure Function maken.

Onthouden Een procedure Sub geeft iets door. Een procedure Function kan ook iets doorgeven, maar ook z'n eigen waarde teruggeven.

Plaats in de module die je hebt gemaakt de volgende procedure (MT). Nadat je het woord Function hebt getypt plaats en op Enter hebt gedrukt, je er zelf As String achter. Zo declareer je de functie als een type String (het data type voor de functie). Hierdoor geeft de functie een tekenreeks (een String) als waarde terug. Dit is in VBA niet verplicht, maar het is verstandig dit wel altijd te doen. Doe je dit niet, dan maakt VBA er een type Variant van zodat elke waarde 'erin past'. Een Variant vergt meer geheugen. Vaak is een Variant nodig, maar lang niet altijd. Een Variant kost extra geheugen wat we - als het kan - het liefst willen vermijden. Later meer hierover.

OnthoudenIets wat in VBA niet is gedeclareerd wordt in VBA een Variant en dat is minder gunstig.

Deze functie MT wordt in alle Office Programs applicaties ingezet. MT staat voor 'Message Title'. Stel de waarde in op een algemene waarde, bijvoorbeeld je naam of de naam van je bedrijf. Een String wordt in VBA tussen dubbele aanhalingstekens weergegeven zoals "Je algemene titel". De functie MT zelf is ook als een type String gedeclareerd (As String) omdat de functie een tekenreeks moet teruggeven. Met MT = "Je algemene titel" hebben we de functie ingesteld op de waarde die de functie moet teruggeven. In dit geval een heel eenvoudige regel, maar een functie kan ook zeer complexe zaken berekenen a.d.h.v. allerlei voorwaarden en kan ook een getal, een datum etc. teruggeven.

De functie MT heb je later bij andere voorbeelden ook nodig.

Function MT() As String

    MT = "Je algemene titel"

End Function

Nu gaan we onze procedure MijnProc aanpassen. In MijnProc heeft MsgBox drie argumenten. Zoals je ziet wordt de procedurenaam en het eerste argument niet door een komma van elkaar gescheiden. De daarop volgende argumenten worden wel door een komma gescheiden.

In het volgende voorbeeld is het argument Title van de procedure MsgBox vervangen door onze functie MT. Deze functie zal voortaan de waarde gaan leveren voor dit argument. In MijnProc wordt MT aangeroepen en zal de ingestelde waarde retourneren (teruggeven). Zo kunnen we op één locatie en in één keer bepalen wat door al onze applicaties de titel van alle berichtvensters zal gaan worden. Hergebruik van code is kenmerkend voor goede programmeurs. Dit is een heel simpel voorbeeld, maar zie het zeker als een essentieel feit dat we steeds op ons pad zullen tegenkomen.

Tip De functie MsgBox is een 'ingebouwde (VBA) functie'. Onze functie MT hebben we zelf gemaakt en wordt daarom een 'gebruikers gedefinieerde functie' genoemd. Het mooie is, dat de werkwijze voor beide soorten hetzelfde is; je kan er op dezelfde manier mee omgaan. Dat verruimt de toepassingsmogelijkheden enorm.

MijnProc is nu volledig variabel te gebruiken maar we hebben er niet zoveel aan; het is nog slechts een demonstratie van hoe het werkt. In de volgende rubriek gaan we wat meer dynamiek toepassen.

Tip Zoals je ziet kan je VBA commentaar in programmacode plaatsen door een ' te gebruiken. Een toelichting is vaak belangrijk. Echter, commentaar in code is niet altijd voldoende voor goede documentatie. Je kan overwegen om uitgebreide toelichting te noteren in Microsoft Word. Word is een zeer krachtig middel waar je heel veel mee kan doen. We zullen het later in de lessen meemaken.

Sub MijnProc(strMsg As String)

' strMsg geeft een waarde door en MT geeft een waarde terug.

    MsgBox strMsg, vbInformation, MT

End Sub

Nabeschouwing

De belangrijkste dingen die we hebben geleerd:

  • In een Standaardmodule slaan we code op die we globaal gebruiken.
  • Binnen een procedure kunnen we coderegels (statements) plaatsen om elke willekeurige opdracht uit te voeren.
  • Een procedure is als een draadje dat verweven wordt met andere procedures.
  • Coderegels vormen procedures, die vormen modules en die weer programma's. Het lijkt op het breien van een trui: de draadjes gaan de trui vormen.
  • We kunnen gebruik maken van zowel ingebouwde VBA functies (zoals MsgBox) als van functies die we zelf hebben geschreven zoals de functie MT ('gebruikers gedefinieerde functies').
  • Met argumenten kunnen waarden worden doorgegeven (ook teruggegeven) zodat procedures in variabele omstandigheden kunnen worden gebruikt. Argumenten zijn in wezen 'variabelen' waarin waarden kunnen worden opgeslagen.
  • Argumenten worden door een komma van elkaar gescheiden.
  • Als we code goed ordenen kunnen we code hergebruiken voor meerdere doelen. Dit is zoals professionele programmeurs dat doen.
  • We gaan in de lessen procedures gebruiken en opslaan die ook door Office Programs worden gebruikt zoals MT en nog veel meer. Je kunt hiermee ervaring opdoen en je eigen systeem opbouwen.
Cursussen