Beginnen met VBA - 2

Inleiding

Dynamischer met code

De meesten werken (bijvoorbeeld in Access) met macro's. In Access bijvoorbeeld, zijn macro's onderhevig aan een structuur die behoorlijk star is, terwijl met programmacode alles mogelijk is. Met programma kan je het verloop dynamisch aansturen in elke situatie. Zo kan je bijvoorbeeld een procedure Function laten controleren of een bestand in gebruik is en vervolgens de gebruiker in een bericht meedelen dat daarom een procedure wordt afgebroken. Maar voor nu houden we het wat eenvoudiger.

Niveau

  • Je hebt de eerste les VBA gevolgd.

Het programma sturen

In deze les gaan we leren hoe we onder verschillende omstandigheden het programma kunnen sturen. We gebruiken weer CallMijnProc en MijnProc.

Sub CallMijnProc()

    MijnProc "Goedemorgen wereld"

End Sub

Sub MijnProc(strMsg As String)

    MsgBox strMsg, vbInformation, MT

End Sub

Functie MsgBox analyseren

Pas de waarde van het argument strMsg in CallMijnProc aan zoals in onderstaand voorbeeld. Plaats de invoegpositie in CallMijnProc en druk op F5 om MijnProc uit te voeren. Wees gerust, er komt geen kerel uit je monitor gekropen.

Als je de invoegpositie in MijnProc zou plaatsen en dan op F5 drukt, verschijnt er een dialoogvenster met macro's. Dat komt doordat VBA de waarde van het argument strMsg nodig heeft en vraagt je daarom om een macro te starten die die waarde levert. Vandaar we dit steeds doen via een aanroepende procedure zoals CallMijnProc. Die levert die waarde.

Sub CallMijnProc()

    MijnProc "Goedemorgen Anne, wil je even koffie zetten?"

End Sub

Sub MijnProc(strMsg As String)

    ' Even afwachten wat het antwoord zal zijn…

    If MsgBox(strMsg, vbQuestion + vbYesNo, MT) = vbNo Then

        MsgBox "Jammer zeg!", vbExclamation, MT

    Else

        MsgBox "Dat is fijn, dankjewel.", vbInformation, MT

    End If

End Sub

Toelichting

Waarde wel of niet door een functie laten teruggeven

Het is je misschien opgevallen dat MsgBox op twee verschillende manieren wordt gebruikt. Dat kan omdat het een procedure Function is. Zoals we in de vorige les hebben gezien, kan een functie een waarde leveren én een waarde teruggeven. Dat gebeurt op verschillende manieren.

  • Bij onze functie MT hebben we gezien dat een functie een waarde kan teruggeven als de functie wordt aangeroepen zoals in MijnProc. Omdat MT geen argumenten heeft worden die ook niet meegegeven.
  • De VBA functie MsgBox heeft wel argumenten. Als de functie wordt aangeroepen met direct een haakje openen, gevolgd met de argumenten en een haakje sluiten, dan geeft de functie een waarde terug. In dit geval de waarde van de knoppen. Zo meteen meer daarover.
  • Ondanks de VBA functie MsgBox argumenten heeft, hebben we gezien dat deze ook werd aangeroepen zonder de haakjes openen en sluiten. Dit demonstreert dat een functie ook kan worden gebruikt om een waarde door te geven of gewoon om een opdracht uit te voeren zoals een procedure Sub.

Het lijkt misschien moeilijk, maar dat val erg mee. Als je straks wat meer routine hebt, komt het vanzelf. Bovendien is de Visual Basic Editor erg gebruiksvriendelijk want die laat je wel weten als je dit niet goed doet. Dan nog even dit:

Kijk naar het voorbeeld. Als aan de linkerkant van de functie iets staat, dan geeft de functie zijn waarde terug. In dit geval staat er If, wat inhoud dat er vervolgens een waarde moet komen die MsgBoxretourneert. Hetzelfde geldt bij MT waar die wordt aangeroepen door MsgBox.

Wat de knoppen zijn en wat ze doen

In het voorbeeld zie je waarden als vbQuestion, vbExclamation, vbYesNo etc. Kortgezegd zijn dit ingebouwde vb-constanten (constanten die aan Visual Basic zijn toegekend). In dit geval vertegenwoordigen ze een numerieke waarde. In het volgende statement geven we opdracht aan het argument Buttons door (het tweede argument van MsgBox) dat we een vraagteken willen, een Ja en een Nee knop. Wanneer een gebruiker op een van de knoppen drukt, wordt een waarde teruggegeven aan MsgBox. If analyseert die waarde zodat bekend is hoe de besturing verder moet gaan. In dit geval hebben we ervoor gekozen a.d.h.v. vbNo iets te ondernemen, maar dat had even zo goed vbYes kunnen zijn.

De lering hier is dat we a.d.h.v een teruggegeven waarde van de functie het programma kunnen sturen.

    If MsgBox(strMsg, vbQuestion + vbYesNo, MT) = vbNo Then

Je kan niet alleen bepalen welke knoppen in het berichtvenster worden weergegeven, maar ook hoe. In het volgende voorbeeld zorgt vbDefaultButton2 ervoor dat de tweede knop (de Nee knop) de standaardknop wordt. Doe dit in wat meer critische gevallen waarin je wilt dat de gebruiker niet te snel op Ja zal klikken. Hij moet nu bewust voor Ja kiezen.

    If MsgBox(strMsg, vbQuestion + vbYesNo + vbDefaultButton2, MT) = vbNo Then

De aansturing professionaliseren

In opvolging van het vorige voorbeeld, is hier een handige functie en tevens tip, waar je veel gemak van zult hebben. MsgAskCont (vragen of verder gegaan moet worden) is een Office Programs functie. We beschikken over veel gedeelde en complete berichten. Al die procedures hebben allemaal de prefix Msg. Ze staan ook allemaal in een module met de naam modMsg. Dit is louter voor het goed ordenen van objecten binnen applicaties. Of je dit advies overneemt, is aan jou. Plaats de functie MsgAskCont in een standaardmodule.

Function MsgAskCont() As String

    ' Wordt onder verschillende omstandigheden gebruikt.

    MsgAskCont = vbNewLine & vbNewLine & "Weet u zeker dat u door wilt gaan?"

End Function

Het volgende voorbeeld maakt gebruik van MsgAskCont op dezelfde wijze als MT. Het illustreert net zoals in ons vorige voorbeeld hoe een procedure kan worden afgebroken. Alleen nu zijn we plots wat serieuzer geworden, want dit is nu typisch een voorbeeld zoals je dat vaak in je code zult gaan gebruiken.

Ook nu wordt voorzichtigheid in acht genomen om de gebruiker bewuster op Ja te laten klikken. Dat je de waarde voor het argument Prompt van MsgBox (de tekst) moet aanpassen snap je toch zeker wel hè?! De waarde die MsgAskCont teruggeeft hoeven we ook al niet meer telkens opnieuw te schrijven én... we zijn professioneel en consistent bezig.

De code in dit voorbeeld komt straks ergens bij jouw in een daarvoor geschikte procedure met wellicht nog andere code ervoor en erna. Met de If... Then... test bepaal je wat er moet gebeuren. De regel Exit Sub zorgt ervoor dat de procedure onmiddellijk wordt verlaten.

Als je onderstaande code helder hebt, ben je goed bezig. Want het begint er nu toch echt op te lijken. Het is wel weer een lang verhaal geworden, maar je hebt wel essentiële dingen geleerd. En wat heel belangrijk is: je hebt het geduld opgebracht. Geduld is de hoogste deugdzaamheid.

Sub ProcName()

    If MsgBox("De data uit de tabellen is veilig gesteld. De tabellen kunnen nu worden gewist." & _

        MsgAskCont, vbQuestion + vbYesNo + vbDefaultButton2, MT) = vbNo Then

        Exit Sub

    Else

        ' Instructies hier.

    End If

End Sub

Nabeschouwing

  • We hebben onze code dynamischer gemaakt.
  • We weten welke knoppen en hoe we deze op een berichtvenster kunnen weergeven.
  • We weten hoe we de teruggegeven waarde van de functie MsgBox kunnen analyseren (dus ook van andere functies) en hoe we a.d.h.v. die waarde kunnen reageren.
  • We hebben een volgende stap gezet om berichtvensters verder te gobaliseren. Dit geeft je tevens inzicht in hoe je dingen aan elkaar kunt verbinden.
  • We zien steeds meer dat goed nadenken over zaken, hoe we het opzetten, ons veel voordeel zal bieden. De kunst is om er een groot samenwerkend systeem van te maken. Volg deze lessen, dan gaat dat zeker lukken!
Cursussen