De specialist in Microsoft Access databases

Kennismaken met Visual Basic for Applications - niveau 1

Een eerste praktische ervaring

In deze eerste kennismakingscursus leert u op eenvoudige wijze uw eerste procedures schrijven. Tevens maakt u kennis met een aantal objecten waar u uw gehele loopbaan als VBA ontwikkelaar mee te maken zult krijgen. Kortom, een erg belangrijke basis voor een mooie en vruchtbare bezigheid.

Inhoudsopgave

Woord vooraf

Een procedure Sub schrijven

Instructies aan de procedure toevoegen

Een eerste kennismaking met argumenten en constanten

Meer mogelijkheden met het berichtvenster

Een procedure Function schrijven

De waarde van een functie als resultaat geven

Programmacode sneller maken

Acties ondernemen aan de hand van de keuze van de gebruiker

Een procedure verlaten

Waarden tot een tekenreeks aan elkaar lassen

Tot slot

Woord vooraf

In deze cursus wordt er van uitgegaan dat u de volgende pagina's heeft doorgenomen:

Verder wordt er in deze cursus van uitgegaan dat u nog helemaal niets van programmeren in VBA weet. Voor wat dat betreft bent u een volbloed groentje, maar niet lang meer! Het ontgroeningproces treedt zo meteen in werking! En u bent gewaarschuwd: dit proces is behoorlijk radicaal, want de titel 'groentje' zult u snel ontgroeien. En nadat u eenmaal de eerste stappen in dit proces hebt gezet, zult u naar alle waarschijnlijkheid een van de velen worden die vele uren voor de computer zal doorbrengen (niet 'erachter' want dan ziet u alleen maar bedrading).

Een procedure Sub schrijven

Voordat we overgaan tot het schrijven van een procedure (een of meerdere regels programmacode), zullen we gaandeweg kennismaken met objecten waarmee u vaak zult werken. In deze eerste kennismakingscursus wordt u wel behoorlijk 'bij het handje genomen', maar dat is nodig om basisvaardigheden goed aan te leren en om basiskennis op te doen. Alleen op die manier wordt u op de juiste manier op het juiste spoor gezet.

Omdat vrijwel iedereen over Microsoft Word beschikt, zullen we de eerste stappen in Visual Basic for Applications uitvoeren met behulp van Microsoft Word.

  1. Start Microsoft Word.
  2. Druk op Alt+F11.

Het scherm dat u nu ziet is de Visual Basic Editor. In de titelbalk staat: Microsoft Visual Basic, maar als het puntje op de i wordt gezet klopt dat voor geen meter[1], maar dat is nu even niet belangrijk.

Om enige voorbereidingen te treffen voert u de volgende stappen uit:

  1. Klik op de knop Projectverkenner op de werkbalk Standaard. Er verschijnt nu een venster met mappen en objecten. Welke objecten er worden weergegeven, is afhankelijk van welke sjablonen en/of documenten (projecten) er zijn geopend. Bovenaan in de Projectverkenner ziet u het project Normal. Het project Normal is het standaardproject van Word en is altijd geladen wanneer Word wordt uitgevoerd. Op de Projectverkenner en de objecten gaan we nu niet verder in. U heeft nu een belangrijk object (de Projectverkenner) leren kennen zodat u zich alvast wat beter kunt oriënteren welke zaken er spelen.
  2. Ga naar het menu Invoegen en kies Module. Er wordt nu een standaardmodule toegevoegd aan het project dat actief is. Voor nu is het niet belangrijk welk project dat is. In de zojuist toegevoegde module zullen we zo meteen onze programmacode gaan schrijven.
  3. Het is een goede gewoonte om informatie meteen op te slaan, in dit geval slaan we de module op. Druk op Ctrl+S of sla de module op via de werkbalk of via het menu Bestand.
  4. Er wordt een standaardnaam toegewezen. Deze kunt u eventueel wijzigen. Als u dat wilt, klik dan op de knop Eigenschappen op de werkbalk Standaard. Het venster Eigenschappen wordt geopend. Daar kunt u de naam van de module wijzigen. Zo, alweer een object leren kennen. U kunt het venster weer sluiten door op het kruisje rechtsboven te klikken.
  5. Als het goed is wordt bovenin de module de volgende regel weergegeven[2]:
  6. Option Explicit
    

    Zorg ervoor dat de regel Option Explicit altijd bovenaan in de module staat. Deze regel dwingt het declareren van variabelen af. In de vervolgcursussen leert u meer over variabelen.

  7. Linksonder in het venster Programmacode zijn twee knoppen beschikbaar. Zorg ervoor dat de knop Volledige module weergeven is ingeschakeld. Hierdoor kunt u straks meerdere procedures tegelijk zien.

Wanneer bovenstaande stappen zijn uitgevoerd zijn we klaar voor het schrijven van onze eerste programmacode.

Typ in het venster Programmacode de volgende regel en druk op Enter:

Sub MijnProc

Nadat u op Enter heeft gedrukt, plaatst VBA automatisch twee haakjes achter Sub MijnProc en voegt de regel End Sub toe:

Sub MijnProc()

End Sub

Wat nu wordt weergegeven is een procedure Sub. De instructie Sub MijnProc geeft het begin en de naam van de procedure aan. De naam van een procedure moet beginnen met een alfanumeriek karakter. Met End Sub wordt het einde van de procedure gedefinieerd.

Instructies aan de procedure toevoegen

De eerste procedure is nu gemaakt. Echter, het is een procedure zonder instructies. Instructies zijn de regels programmacode binnen een procedure. Wanneer deze procedure wordt uitgevoerd, gebeurt er dus niets. We zullen nu wat instructies gaan schrijven zodat we het een en het ander in de praktijk aan het werk kunnen zien.

Opmerking

Plaats de invoegpositie ergens binnen de procedure en typ letterlijk: msgbox, vervolgens een spatie en dan "Mijn eerste berichtvenster." (inclusief de aanhalings- en sluitingstekens). Nadat u de spatie na msgbox heeft getypt, verschijnt er een infovenster met informatie (syntaxisinfo)[3]. Dit infovenster verschijnt omdat u een ingebouwde functie heeft getypt en VBA dit als zodanig herkent. Later in deze cursus wordt uitgelegd wat functies zijn. Ook over dit berichtvenster straks meer.

Druk op Enter of plaats de invoegpositie in een andere regel binnen het venster Programmacode. VBA controleert nu of u fouten heeft gemaakt en ook op het juiste gebruik van hoofdletters. Zoals u ziet wordt de naam van de ingebouwde functie nu automatisch aan de oorspronkelijke naam aangepast.

Onze procedure ziet er nu als volgt uit:

Sub MijnProc()
    MsgBox "Mijn eerste berichtvenster."
End Sub

Nu gaan we de procedure uitvoeren. Zorg ervoor dat de invoegpositie zich binnen de procedure bevindt en druk op F5. U kunt ook op de knop Sub/UserForm uitvoeren klikken op de werkbalk Standaard. Er verschijnt nu een berichtvenster met de knop OK erop. Deze knop wordt standaard weergegeven. Klik op OK in het berichtvenster.

Een eerste kennismaking met argumenten en constanten

De functie MsgBox heeft een aantal argumenten. Aan deze argumenten gaan we nu waarden toekennen en geven ze vervolgens door aan de functie MsgBox. Zo kunnen we aan de functie MsgBox informatie doorgeven over wat er nog meer moet gebeuren dan louter het weergeven van een kaal berichtvenster.

Plaats de invoegpositie aan het einde van de regel die zojuist is toegevoegd en typ een komma. Weer verschijnt het venster met de syntaxisinfo. Doordat u een komma heeft getypt (dat is het scheidingsteken voor de argumentenlijst) staat de invoegpositie nu op de plaats voor het tweede argument van de functie MsgBox. In dit argument wordt een waarde doorgegeven voor de stijl (knoppen en pictogram). We gaan eerst knoppen toevoegen.

Na het typen van de komma is er een lijst verschenen met ingebouwde constanten. Deze ingebouwde constanten vertegenwoordigen allemaal numerieke waarden, want welke knoppen er op een berichtvenster worden weergegeven, wordt in werkelijkheid bepaald door een getal. In plaats van een keuze uit de weergegeven lijst te maken zou u nu ook gewoon het getal 4 kunnen typen als geldige waarde. Het getal 4 geeft als resultaat dat er een knop Ja en een knop Nee op het berichtvenster wordt weergegeven. Echter, het onthouden van welke getallen voor welke waarden staan is niet praktisch. Kies daarom het item vbYesNo (handiger is om vby te typen zodat het item sneller wordt geselecteerd). Wanneer het item in de lijst geselecteerd wordt weergegeven, drukt u op de Tab-toets. Voer de procedure weer uit.

Onze procedure ziet er nu zo uit:

Sub MijnProc()
    MsgBox "Mijn eerste berichtvenster.", vbYesNo
End Sub

Zoals de procedure momenteel is, wordt in de titel van het berichtvenster de naam van de toepassing weergegeven. In dit geval wordt de titel Microsoft Word weergegeven omdat we in Word Visual Basic for Applications aan het werk zijn.

We gaan onze procedure nu verder aanpassen zodat we een de titel in het berichtvenster zelf kunnen bepalen. Hiervoor moeten we aan de functie MsgBox een derde argument doorgeven.

Plaats de invoegpositie weer aan het einde van de regel en typ weer een komma en vervolgens "Ontgroening volbracht!". U mag er natuurlijk ook best iets anders van maken.

Onze procedure bestaat nu uit een functie met 3 argumenten:

  1. Een argument voor het weer te geven bericht.
  2. Een argument voor de stijl.
  3. Een argument voor de titel.

En zo ziet de procedure er nu uit:

Sub MijnProc()
    MsgBox "Mijn eerste berichtvenster.", vbYesNo, "Ontgroening volbracht!"
End Sub

Voer de procedure weer op de gebruikelijke wijze uit om het resultaat te zien.

Meer mogelijkheden met het berichtvenster

Nu gaan we voor de gebruiker meer duidelijkheid leggen in het soort bericht dat het berichtvenster vertegenwoordigt. In ons voorbeeld betreft het een vraag. Om dit aan een gebruiker te verduidelijken kunnen we een pictogram met een vraagteken op het berichtvenster plaatsen. Doe hiervoor het volgende:

Typ na vbYesNo een Plus-teken. Weer verschijnt de lijst met constanten. Typ vbq en druk op de Tab-toets wanneer vbQuestion is geselecteerd. Plaats de invoegpositie weer uit de regel.

De procedure ziet er nu als volgt uit:

Sub MijnProc()
    MsgBox "Mijn eerste berichtvenster.", vbYesNo + vbQuestion, "Ontgroening volbracht!"
End Sub

Voer de procedure weer uit om het resultaat te zien.

Nu gaan we aan de functie MsgBox ook doorgeven welke knop standaard de focus moet hebben. Ook dit moet in het tweede argument van de functie worden doorgegeven. Voeg op dezelfde manier het volgende toe: + vbDefaultButton2. Wijzig de tekst van het eerste argument van de functie MsgBox in "Weet u zeker dat u door wilt gaan?". (Dit omdat het hier toepasselijk en tegelijkertijd een goed voorbeeld voor later is.)

De procedure ziet er nu als volgt uit:

Sub MijnProc()
    MsgBox "Weet u zeker dat u door wilt gaan?", vbYesNo + vbQuestion + vbDefaultButton2, "Ontgroening volbracht!"
End Sub

Wanneer u de procedure uitvoert zult u zien dat de knop Nee nu de focus heeft. Wanneer er zich 'fatale gevolgen' kunnen voordoen wanneer een gebruiker op Ja klikt, is het veiliger om de gebruiker uitdrukkelijk de Ja knop te laten kiezen. Bovendien moet u niet zo goedgelovig zijn dat gebruikers berichtvensters altijd lezen... Wanneer de knop Nee de focus heeft, moet de gebruiker doelbewust voor Ja kiezen hetgeen een verkeerde (fatale) keuze helpt voorkomen.

Opmerking

De procedure MijnProc laten we even rusten, maar we komen er zo meteen bij terug. We gaan eerst een procedure Function schrijven.

Een procedure Function schrijven

Een procedure Function is ongeveer gelijk aan een procedure Sub. Zoals we hebben gezien kunnen we een procedure Sub instructies laten uitvoeren. Een procedure Sub kan ook waarden doorgeven, maar daar komen we in vervolgcursussen op terug.

Een procedure Function kan ook instructies uitvoeren en waarden doorgeven. In tegenstelling tot een procedure Sub kan een procedure Function ook een waarde teruggeven. Dit kunnen we aan de hand van een eenvoudig voorbeeld verduidelijken.

Een procedure Function schrijft u op dezelfde manier als een procedure Sub, maar i.p.v. Sub schrijft u Function. Maak de volgende functie.

Opmerking

Function HalloWereld()
    HalloWereld = "Hallo wereld"
End Function

We hebben nu een 'door de gebruiker gedefinieerde functie' gemaakt. In de procedure MijnProc hebben we gebruik gemaakt van de functie MsgBox. De functie MsgBox is een 'ingebouwde functie'. Beide soorten functies kunnen een waarde als resultaat teruggeven.

De waarde van een functie als resultaat geven

Omdat u nu al best veel geleerd heeft, is de titel "Ontgroening volbracht!" in de procedure MijnProc niet meer van toepassing. Bovendien willen we ervoor zorgen dat we niet steeds een titel voor een berichtvenster hoeven te verzinnen en dat die titel tevens overal dezelfde is. Dat kan door de waarde van de functie steeds als resultaat te geven. Ga naar MijnProc en plaats in het argument voor de titel, de naam van de zojuist gemaakte functie.

De procedure MijnProc ziet er nu zo uit:

Sub MijnProc()
    MsgBox "Weet u zeker dat u door wilt gaan?", vbYesNo + vbQuestion + vbDefaultButton2, HalloWereld
End Sub

Voer de procedure MijnProc uit en let op de titel van het berichtvenster. Cool of niet?

Programmacode sneller maken

Om gegevens te kunnen verwerken moet VBA het gegevenstype nagaan. Hoewel dit onderwerp in een later stadium uitgebreidere aandacht krijgt, is het goed om hier toch even bij stil te staan. De functie HalloWereld geeft namelijk een tekenreeks als resultaat oftewel een String (een tekenreeks van het type String). Uit het vorige voorbeeld is gebleken dat VBA geen enkele moeite heeft om het resultaat van HalloWereld in het berichtvenster weer te geven. Zonder hier te diep op in te gaan, gaan we de functie HalloWereld toch eventjes wat aanpassen.

Plaats de invoegpositie achter de haakjes en typ as, een spatie en vervolgens str. Druk weer op de Tab-toets wanneer het item String in de lijst is geselecteerd. Ziet u hoe gebruiksvriendelijk u in VBA kunt programmeren? De functie HalloWereld ziet er nu als volgt uit:

Function HalloWereld() As String
    HalloWereld = "Hallo wereld"
End Function

Wanneer de waarde van de functie nu door VBA wordt berekend (of weergegeven zoals in de procedure MijnProc), is de code sneller. Toen As String nog niet aan de functie was toegewezen, wees VBA zelf een gegevenstype toe, namelijk het type Variant. Wanneer er geen gegevenstype is gedeclareerd moet VBA zelf een gegevenstype aanhouden. Het gegevenstype Variant (niet verwarren met variabele) vergt meer geheugen waardoor de code trager wordt uitgevoerd. Daarnaast is het vaak noodzakelijk om een functie als een bepaald gegevenstype te declareren. Hierover meer in de vervolgcursussen.

Acties ondernemen aan de hand van de keuze van de gebruiker

Met de procedure MijnProc hebben we geleerd hoe we meerdere knoppen in een berichtvenster kunnen weergeven. Nu willen we natuurlijk ook graag weten op welke knop de gebruiker heeft geklikt zodat we de daarbij behorende acties kunnen uitvoeren. Ook hebben we geleerd dat een functie een waarde kan teruggeven. Ook de ingebouwde functie MsgBox kan een waarde als resultaat geven. Hierdoor kunnen we bijvoorbeeld nagaan op welke knop de gebruiker heeft geklikt.

Opmerking

Wijzig de procedure MijnProc in het volgende en voer de procedure weer op de gebruikelijke wijze uit:

Sub MijnProc()
    If MsgBox("Weet u zeker dat u door wilt gaan?", vbYesNo + vbQuestion, HalloWereld) = vbNo Then
        'Geef in berichtvenster het resultaat weer.
        MsgBox "U heeft op de knop Nee geklikt."
    Else
        MsgBox "U heeft op de knop Ja geklikt."
    End If
End Sub 

Een procedure verlaten

Het volgende voorbeeld geeft aan hoe we een procedure kunnen verlaten. Wanneer op Nee wordt geklikt, zorgt de instructie Exit Sub ervoor dat de procedure onmiddellijk wordt verlaten. Wanneer er op Ja wordt geklikt, wordt er een berichtvenster weergegeven met de waarde van de functie HalloWereld. Zo zien we dat we een programma op dynamische wijze kunnen sturen.

Sub MijnProc()
    If MsgBox("Weet u zeker dat u door wilt gaan?", vbYesNo + vbQuestion, HalloWereld) = vbNo Then
        'Procedure verlaten.
        Exit Sub
    Else
        'Hier instructies voor het verloop van het programma, bijvoorbeeld een berichtvenster.
        MsgBox HalloWereld
    End If
End Sub 

Waarden tot een tekenreeks aan elkaar lassen

Tekenreeksen, maar ook waarden van een ander gegevenstype, kunnen tot één tekenreeks aan elkaar worden gelast. In deze voorbeelden zullen we een paar andere ingebouwde functies gebruiken zodat we ook daar even kennis mee maken.

Maak de volgende functie:

Function MijnTekenreeks() As String
        MijnTekenreeks = "Het is vandaag " & Date
End Function

Wijzig MijnProc in:

Sub MijnProc()
    MsgBox MijnTekenreeks
End Sub

Plaats de invoegpositie in MijnProc en voer de procedure uit. U ziet nu dat het koppelteken (&) ervoor zorgt dat de reeks "Het is vandaag " &, gekoppeld wordt aan het resultaat van de ingebouwde functie Date (die de systeemdatum als resultaat geeft).

Wijzig MijnTekenreeks nu in het volgende voorbeeld. U ziet dat u tekenreeksen (in veel gevallen ook andere regels met programmacode) kunt onderbreken met een liggend streepje (underscore). Ook dit is om de code leesbaarder te maken.

Function MijnTekenreeks() As String
    MijnTekenreeks = Date & " was een mooie dag, want " _
    & "toen heb ik de eerste stappen gezet op het " _
    & "gebied van Visual Basic for Applications."
End Function

Voer weer MijnProc uit.

Nu gaan we met de procedure MijnProc een andere waarde van de functie MijnTekenreeks ophalen, namelijk het aantal karakters. De ingebouwde functie Len geeft namelijk de lengte (het aantal karakters) van een tekenreeks terug.

Wijzig de procedure MijnProc nu in het volgende en voer de procedure weer op de gebruikelijke wijze uit. In dit voorbeeld wordt onze eigen functie MijnTekenreeks gebruikt als argument voor de ingebouwde functie Len.

Sub MijnProc()
    MsgBox "Het aantal karakters is: " & Len(MijnTekenreeks)
End Sub

Met de functie LCase kan een tekenreeks in kleine letters worden omgezet; de functie UCase daarentegen, zet een tekenreeks om in hoofdletters. Wijzig MijnProc in het volgende en voer de functie weer uit.

Sub MijnProc()
    MsgBox UCase(MijnTekenreeks), vbInformation, "Hallo lekker stuk"
End Sub

Tot slot

U heeft in deze cursus niet veel programmacode geschreven, maar u heeft belangrijke basisvaardigheden goed aangeleerd. Dat is een goede investering voor later. Tijdens de oefening heeft u ook veel basiskennis opgedaan. Deze twee, basisvaardigheden en basiskennis, zijn beide belangrijk voor uw verdere ontwikkeling in Visual Basic for Applications. U zult daar veel profijt van ondervinden. Bovendien is iets pas echt leuk wanneer de materie duidelijk is, nietwaar? In de vervolgcursussen kunnen we nu veel vlotter door de materie en wordt het nóg leuker! Voor nu alvast gefeliciteerd met deze eerste stappen!

Aanvullende informatie

Reageren?
Uw mening over deze cursus wordt zeer op prijs gesteld en gebruikt om cursussen te verbeteren. Klik hier om uw reactie op deze cursus te verzenden. Alvast hartelijk bedankt voor de genomen moeite!

Eindnoten

[1] We programmeren zowaar wel in Visual Basic, maar de toepassing waarnaar u nu kijkt is niet Visual Basic (hoewel Microsoft dat wel in de titelbalk aangeeft). De toepassing Visual Basic is een programma dat apart moet worden aangeschaft, het wordt niet met het Microsoft Office pakket meegeleverd. Met Visual Basic kunt u o.a. afzonderlijke toepassingen maken zonder dat daarbij een Microsoft Office toepassing bij komt kijken. Waar u nu naar kijkt is Visual Basic for Applications en dat is iets anders dan Visual Basic. Dit is nu net iets dat erg verwarrend kan zijn. Ik kan me nog goed herinneren dat ik eens een object moest maken. De informatie was: 'u maakt dat in Visual Basic.' Ik dacht 'geen probleem, ik hoef dus geen extra software bij te kopen. Visual Basic heb ik al...'

[2] Als deze regel niet wordt weergegeven, ga dan naar Opties in het menu Extra. Klik op het tabblad Editor en schakel het selectievakje Variabelen declareren vereist in.

[3] Als er geen syntaxisinfo verschijnt is de optie hiervoor wellicht uitgeschakeld. U kunt deze optie inschakelen via het tabblad Editor van het dialoogvenster Opties in het menu Extra.

RegID: 8vi48gtnno
Bijgewerkt op: 6 februari 2006
Auteur: Peter van Loosbroek - Office Programs
Locatie: www.officeprograms.nl
Copyright: Zie voor gebruik van deze informatie www.officeprograms.nl/glb_copyright.htm
Overige informatie: Geen