Beginnen met VBA - 3

Inleiding

Niveau

  • Je hebt de eerste twee lessen VBA gevolgd.
  • Je weet hoe foutafhandeling in VBA werkt.
  • Je weet wat Variabelen zijn en dat een variabele van een bepaald gegevenstype een bepaalde standaardwaarde heeft.

In deze les leren we de basis van hoe we testen uitvoeren met verschillende gegevenstypen. Vervolgens hoe we een procedure Function correct instellen en verlaten.

Testen op gegevenstype

Het is altijd goed om vooraan in een procedure (Sub of Function, maakt niet uit) te testen op een waarde die in de procedure nodig is. Die waarde kan op verschillende manieren worden geleverd, bijvoorbeeld middels een doorgegeven argument of een procedure Function. In deze rubriek zullen we een paar algemene testen uitvoeren in een procedure Sub. Het is een algemene basis en erg zinvol dit steeds in ogenschouw te nemen bij het schrijven van procedures.

We mogen er niet zomaar altijd van uitgaan dat waarden altijd worden doorgegeven. We hebben gezien dat variabelen van een bepaald gegevenstype een bijbehorende standaardwaarde hebben. Dit gaan we in deze voorbeelden gebruiken om op te testen.

Tip In artikel VBE verkennen leer je hoe je het venster Direct kunt gebruiken om testen uit te voeren. Je kan ook een procedure maken waarin je de procedure aanroept die je wilt testen.

De berichtvensters in deze voorbeelden zijn louter voor de verduidelijking van de testen.

Een String testen

De standaardwaarde voor een String is "". Straks zullen we zien dat dat ook iets is (het is dus niet niks). Daarom is het belangrijk om een String altijd te testen met de VBA functie Len. In het volgende voorbeeld is het argument strX een String. Wanneer de procedure zo wordt aangeroepen...

ProcName ""

... dan wordt wel een waarde meegegeven, maar "" zal in de meeste gevallen niet de bedoeling zijn.

Sub ProcName(strX As String)

    

    On Error GoTo Bye_Err

    

    If Len(strX) = 0 Then

        MsgBox "De doorgegeven waarde is een reeks met een lengte van 0 karakters."

        Exit Sub

    Else

        MsgBox strX

    End If

    

Bye_End:

    Exit Sub

Bye_Err:

    MsgBox MsgErr, vbCritical, MT

    Resume Bye_End

End Sub

Een Variant testen

De standaardwaarde voor een Variant is Null. Null betekent 'ongedefinieerd' of 'geen waarde'. We hebben gezien dat "" ook iets is. Null is dus iets anders dan "". Een Variant gebruik je wanneer Null mogelijk is of als je vooraf niet weet van welk type de waarde zal zijn.

Geven we...

ProcName ""

... mee, dan zal in het volgende voorbeeld de VBA functie IsNull False teruggeven omdat "" niet Null is. Roepen we de procedure aan met...

ProcName Null

... dan geeft IsNull True. En omdat het argument varX in dit voorbeeld een verplicht argument is, moeten we het meegeven. Nu zal je jezelf misschien afvragen: "Maar Null is toch niks, waarom moet het dan bij de aanroep worden meegegeven?" Dat is omdat het argument verplicht is én omdat we in dat geval minimaal de standaardwaarde moeten doorgeven. In de rubriek Een test binnen een procedure Function zullen we er een voorbeeld van geven.

Sub ProcName(varX As Variant)

    

    On Error GoTo Bye_Err

    

    If IsNull(varX) Then

        MsgBox "Er is geen waarde doorgegeven."

        Exit Sub

    Else

        MsgBox varX

    End If

    

Bye_End:

    Exit Sub

Bye_Err:

    MsgBox MsgErr, vbCritical, MT

    Resume Bye_End

End Sub

Een Long testen

De standaardwaarde voor een Long is 0. Dit geldt voor alle numerieke gegevenstypen zoals Integer, Single, Double, Currency. Het argument moet nu dan ook als een numerieke waarde worden doorgegeven, bijvoorbeeld:

ProcName 10

Sub ProcName(lngX As Long)

    

    On Error GoTo Bye_Err

    

    If lngX = 0 Then

        MsgBox "De doorgegeven waarde is 0."

        Exit Sub

    Else

        MsgBox lngX

    End If

    

Bye_End:

    Exit Sub

Bye_Err:

    MsgBox MsgErr, vbCritical, MT

    Resume Bye_End

End Sub

Een Date testen

Een Date heeft geen standaardwaarde. We moeten dus op een andere manier testen en dat doen we met de VBA IsDate. In het volgende voorbeeld wordt dteX als een Date doorgegeven. Zorg er altijd voor dat IsDate deze waarde als een echte datum kan herkennen, anders ontstaat er een fout.

Opmerking Als je datums met code moet verwerken, is het belangrijk dat je een Letterlijke datum gebruikt.

Tip Omdat IsDate True of False teruggeeft (een Boolean waarde), kan de test ook met de Not operator worden uitgevoerd:

    If Not IsDate(dteX) Then

Voor een voorbeeld uit de praktijk, zie o.a. CalcAge.

Sub ProcName(dteX As Date)

    

    On Error GoTo Bye_Err

    

    If IsDate(dteX) = False Then

        MsgBox "De doorgegeven waarde is geen geldige datum."

        Exit Sub

    Else

        MsgBox dteX

    End If

    

Bye_End:

    Exit Sub

Bye_Err:

    MsgBox MsgErr, vbCritical, MT

    Resume Bye_End

End Sub

Een Boolean testen

Een Boolean waarde kan False of True zijn. De standaardwaarde voor een Boolean is False.

TipAls je wilt testen of een Boolean waarde True is, dan is If blnX = True Then, niet nodig. De volgende regel volstaat ook:

    If blnX Then

    ...

Sub ProcName(blnX As Boolean)

    

    On Error GoTo Bye_Err

    

    If blnX = False Then

        MsgBox "De doorgegeven waarde is False."

        Exit Sub

    Else

        MsgBox blnX

    End If

    

Bye_End:

    Exit Sub

Bye_Err:

    MsgBox MsgErr, vbCritical, MT

    Resume Bye_End

End Sub

Procedure Function correct instellen en verlaten

Zoals we in een eerdere les hebben gezien, kunnen we een procedure Function een waarde laten teruggeven. Het gegevenstype dat de functie teruggeeft is afhankelijk van hoe we de functie hebben gedeclareerd. De functie kunnen we dus op dezelfde wijze testen zoals we hebben gedaan bij het testen van de waarden in de vorige rubriek.

Of we nu een argument testen of een procedure Function die de waarde levert, maakt niets uit. We gebruiken nu een procedure Function (MyFunction) omdat het weer eens wat anders is. Het gaat er nu om dat we de procedure Function ProcName correct instellen en verlaten. Yip, we gebruiken gewoon dezelfde naam, maar het is nu dus geen procedure Sub zoals in hiervoor.

In het volgende voorbeeld is ProcName gedeclareerd als een Boolean. We moeten er dus voor zorgen dat deze dan ook de juiste Boolean waarde teruggeeft voordat de functie wordt afgesloten. Hoe dat gebeurt zit zo. We hebben geleerd dat de standaardwaarde van een Boolean False is, weet je nog? In dit geval wordt getest op MyFunction. Als deze False teruggeeft, verlaten we onmiddellijk ProcName. Omdat ProcName nu niet op True is ingesteld, krijgt (of beter gezegd 'blijft') de procedure zijn standaardwaarde behouden hetgeen False is. Zou MyFunction True teruggeven, dan worden de overige instructies uitgevoerd. Worden die uitgevoerd zonder dat de procedure wederom verlaten wordt en dus ook zonder fouten, dat wordt ProcName op True ingesteld.

Moet het zo altijd? Nee, maar dit is wel een logische basis. Met de functies die nog beschikbaar zullen komen zal je steeds meer inzicht krijgen in hoe je verschillende situatie aanpakt. Onthouden:

  • De waarde die een functie teruggeeft kunnen we evenzo goed testen als een andere waarde.
  • Binnen een procedure Function moeten we ervoor zorgen dat de functie op de juiste waarde wordt ingesteld. Die waarde moet van het type zijn waarop de functie is gedeclareerd.

Function ProcName() As Boolean

    

    On Error GoTo Bye_Err

    

    If MyFunction = False Then

        Exit Function

    End If

    

    ' Instructies hier

    

    ProcName = True

    

Bye_End:

    Exit Function

Bye_Err:

    MsgBox MsgErr, vbCritical, MT

    Resume Bye_End

End Function

Cursussen