wijzig taal:

Variabelen in VBA worden gebruikt om (tijdelijke) waarden in op de slaan. Het declareren van variabelen houdt in dat geheugenruimte voor deze variabelen wordt gereserveerd. In dit artikel wordt uitgelegd hoe variabelen kunnen worden worden gedeclareerd, welke typen variabelen er zijn en wat de voor- en nadelen zijn van het declareren van variabelen. Het declareren van variabelen is in VBA overigens niet verplicht, maar dat kan wel ingesteld worden.

Typen variabelen

Bij het declareren van variabelen kan aangegeven worden welk type variabele dit betreft. Als dat niet wordt aangegeven of als er geen declaratie plaats vindt, dan krijgt de variabele automatisch het type Variant. In de volgende tabel staan de beschikbare typen variabelen aangegeven met hun kenmerken:

data type waarden bereik grootte default verkort
Boolean Waar (-1) of Onwaar (0) 2 bytes Onwaar (0)  
Byte Gehele getallen van 0 tot met 255 1 byte 0  
Integer Gehele getallen van -32.768 tot en met 32.767 2 bytes 0 %
Long Gehele getallen van -2.147.483.648 tot en met 2.147.483.647 4 bytes 0 &
Single Enkele precisie drijvende komma getallen. Negatieve getallen van -3,402823E38 tot en met -1,401298E-45 en positieve getallen van 1,401298E-45 tot en met 3,402823E38. 4 bytes 0 !
Double Dubbele precisie drijvende komma getallen. Negatieve getallen van -1,79769313486232E308 tot en met -4,94065645841247E-324 en positieve getallen van 4,94065645841247E-324 tot en met 1,79769313486232E308. 8 bytes 0 #
Currency Getallen van -922.337.203.685.477,5808 tot en met 922.337.203.685.477,5807. 8 bytes 0 @
Decimal Voor getallen zonder decimaalteken +/-79.228.162.514.264.337.593.543.950.335 en voor getallen met decimaalteken +/-7,9228162514264337593543950335. 12 bytes 0  
Date Een datum opgeslagen in een getal. Het getal voor de komma betreft de datum en het getal na de komma betreft de tijd. 8 bytes 0  
String (vast) Hierin kunnen 0 tot ± 65.400 letters, getallen (als karakter), spaties en interpunctietekens worden opgeslagen. string lengte ""  
String (variabel) Hierin kunnen maximaal ±2 miljard letters, getallen (als karakter), spaties en interpunctietekens worden opgeslagen. 10 bytes + string lengte "" $
Object Hierin kan een referentie naar een object worden opgeslagen. 4 bytes n.v.t.  
Variant (met getallen) Hierin kunnen allerlei soorten getallen opgeslagen worden. 16 bytes ""  
Variant (met tekst) Hierin kunnen bijvoorbeeld getallen (als tekst), tekst, datum en speciale waarden als Null, Empty, Nothing en Error opgeslagen worden. 22 bytes + string lengte ""  
User Defined Afhankelijk van definitie. afhankelijk van definitie    
LongLong Voor getallen van -9.223.372.036.854.775.808 tot en met 9.223.372.036.854.775.807. Kan alleen gebruikt worden in 64 bits versies. 8 bytes 0  ^
LongPtr Kan gebruikt worden vanaf versie 2010 en wordt in 32 bit automatisch een Long en in 64 bit een LongLong. 4 of 8 bytes 0  

Het Dim statement

Variabelen worden meestal gedeclareerd met het Dim statement. Bijvoorbeeld: "Dim sLocatie as String". sLocatie is hierbij de naam van de variabele en String is het type variabele. De declaraties van variabelen worden meestal aan het begin van een procedure/functie geplaatst, maar dat is niet verplicht. Onderstaand is een voorbeeld te zien van een declaratie van variabelen:

Option Explicit

Sub Declaration()
    Dim s As String
    Dim i As Integer, j As Integer
    Dim k
    Dim m, n, o As Byte

Variabele s is hierbij als een string gedeclareerd en i en j als integers. Voor variabele k is geen data type gedefinieerd en wordt daardoor automatisch een variant. Dus ‘Dim h’ en ‘Dim h as Variant’ is dus in feite hetzelfde. Het is mogelijk op 1 regel meerdere variabelen tegelijk te definiëren, zoals in de tweede regel: ‘Dim i As Integer, j As Integer’. In de laatste regel van dit voorbeeld zijn de variabelen m, n en o gedeclareerd op één regel. Maar omdat alleen o gevolgd wordt door Byte is alleen o een Byte. Variabelen m en n hebben geen datatype en zijn dus daarmee van het type Variant.

Bij het declareren kan uit de data types gekozen worden zoals die staan vermeld in de tabel van de vorige paragraaf. Alleen het data type Decimal is hierbij een buitenbeentje. Dit data type kan niet direct via een Dim-statement gedeclareerd worden. Om een variabele als Decimal te kunnen declareren zal deze eerst als Variant gedeclareerd moeten worden. Daarna moet deze declaratie met CDec omgezet worden naar Decimal. Dus:

Dim DecVar As Variant
CDec (DecVar)

In de tabel uit de vorige paragraaf staat bij sommige variabele ook een verkorte schrijfwijze voor de type declaratie. Dit stamt nog uit het BASIC-tijdperk en wordt vrijwel niet meer gebruikt, maar werkt nog wel. Deze verkorte type declaratie moet direct achter de naam van de variabele geplakt worden. Bijvoorbeeld variabele ‘var’ kan dan als volgt als integer gedeclareerd worden: Dim var%

Naamgeving

De naam die aan een variabele gegeven wordt kan naar eigen inzicht worden bepaald, maar deze naam moet wel aan een aantal eisen voldoen:

  • Er kan gebruik gemaakt worden van letters, cijfers en underscores, maar het eerste karakter moet een letter zijn. Spaties en punten zijn niet toegestaan.
  • VBA maakt geen onderscheid tussen hoofdletters en kleine letters, maar om de leesbaarheid te verbeteren kunnen wel hoofd- en kleine letters gebruikt worden. Bijvoorbeeld KlantNummer i.p.v. klantnummer.
  • De naam van een variabele mag maximaal 254 karakters lang zijn.
  • De karakters voor de verkorte schrijfwijze (%, !, #, $, ^ en &) mogen geen onderdeel uitmaken van een naam van een variabele. Deze karakters mogen alleen gebruikt worden op de laatste positie om hiermee verkort het type te kunnen declareren (zie vorige paragraaf).
  • Er zijn een aantal gereserveerde woorden die niet als naam van een variabele gebruikt mogen worden. De naam van een variabele mag bijvoorbeeld geen VBA-commando zijn.

Option Explicit

Het is in VBA niet verplicht om variabelen te declareren, maar dat kan wel ingesteld worden door “Option Explicit” helemaal bovenaan op de allereerste regel van het programmacode-scherm in te typen. Als er Option Explicit staat dan zal, vóór uitvoering van de code op dat blad, gecontroleerd worden of alle gebruikte variabelen gedeclareerd zijn. Zo niet, dan volgt deze foutmelding:

variabelen declareren 1

Ingesteld kan worden dat Option Explicit altijd automatisch boven elk programmacode-blad wordt geplaatst. Dit kan in de VBA-editor door bij menukeuze Extra→Opties op het tabblad editor een vinkje te plaatsen bij “variabelen declareren vereist”. Vanaf dat moment verschijnt bij nieuwe programmacode-schermen automatisch Option Explicit. Bestaande programmacode-schermen worden overigens niet aangepast.

Werkgebied

Variabelen kunnen gedeclareerd worden voor diverse werkgebieden. Als een variabele binnen een procedure wordt gedeclareerd dan is deze variabele ook alleen aanroepbaar binnen deze procedure. Als de procedure is geëindigd dan verliest de variabele zijn waarde en wordt het gereserveerde geheugen weer vrijgegeven. Variabelen die alleen binnen een procedure geldig zijn kunnen gedeclareerd worden met Dim of Static. Variabelen gedeclareerd met Static behouden wel hun waarde na het beëindigen van de procedure. Behalve wanneer een procedure wordt beëindigd met een End-statement (met uitzondering van End Sub en End Function).

Variabelen kunnen ook gedeclareerd worden op module niveau. Dat wil zeggen dat alle procedures in deze module gebruik kunnen maken van deze variabele. Dit kan gedaan worden door helemaal aan de bovenzijde van de module, direct onder de eventuele Option Explicit of andere Options, deze variabelen te declareren met Dim of Private. Deze variabelen worden dus nog vóór het begin van de eerste procedure gedeclareerd. Hoewel Dim in dit geval dus ook gebruikt kan worden, kan beter gekozen worden voor Private. Zo is aan de declaratie namelijk direct te zien voor welk niveau die geldt.

Variabelen kunnen ook geldig zijn voor het hele project (dus alle procedures en alle modules). Dan moet de variabele gedeclareerd worden met het statement Public. Ook dit statement moet helemaal aan de bovenzijde van een module geplaatst worden. Soms wordt in plaats van Public ook wel Global gebruikt. Global kan alleen maar gebruikt worden in normale modules, terwijl Public in alle modules gebruikt kan worden (dus ook klassemodules, formulieren, worksheets). Global is nog beschikbaar vanwege comptabiliteitsredenen en is eigenlijk compleet verdrongen door Public. Hoewel Public-variabelen dus in alle modules gebruikt kunnen worden gaat de voorkeur uit naar een declaratie in een standaard module. De werkwijze in andere modules is namelijk iets anders. Stel in de klassemodule van blad1 wordt de variabele bTest als Public gedeclareerd (Public bTest as Boolean). Om deze variabele op een ander werkblad te kunnen gebruiken moet de volgende syntax worden gebruikt:

Worksheets("blad1").bTest

Het is toegestaan, maar niet aan te raden, om variabelen op verschillende niveaus dezelfde naam te geven. In een procedure kan een variabele met een naam gedeclareerd worden, welke ook al bestaat als Public variabele. In dit soort gevallen gaat de variabele op het laagste niveau voor.

Richtlijnen

Hier volgen een aantal richtlijnen die gebruikt kunnen worden bij het declareren van variabelen:

  1. Kies bij een data type voor een type met het kleinste geheugengebruik. Het geheugengebruik staat vermeld in de tabel in het begin van dit artikel.
  2. Declareer de variabele op een zo laag mogelijk niveau. Als een variabele alleen maar geldig hoeft te zijn binnen een procedure, declareer deze dan ook procedure-niveau en niet op bijvoorbeeld module-niveau.
  3. Maak zo weinig mogelijk gebruik van het data type Variant.
  4. Hergebruik variabelen indien mogelijk binnen een procedure. Als bijvoorbeeld in een procedure meerdere tellers worden gebruikt in verschillende lussen na elkaar (dus geen geneste lussen), dan kunnen deze variabelen gewoon weer opnieuw worden gebruikt. Wel kan het nodig zijn om de beginwaarde opnieuw in te stellen.
  5. Geef het geheugen van object-variabelen na gebruik vrij door middel van de instructie: Set objvar = Nothing

Voor- en nadelen declareren

Zoals gemeld is het declareren van variabelen niet verplicht is, maar dit heeft toch wel een aantal voordelen:

  1. Voorkomen van typefouten: als Option Explicit wordt gebruikt, dan wordt voor alle gebruikte variabelen gecheckt of deze gedeclareerd zijn. Zo niet, dan volgt een foutmelding bij de betreffende variabelen. Stel er is een variabele gedeclareerd met de naam iLengte en per ongeluk wordt ergens in de code ingetypt iLengt. Deze fout is soms lastig op te sporen. Als Option Explicit is gebruikt kan door middel van de menukeuze Foutopsporing→VBAProject compileren heel snel gecheckt worden of alle variabelen correct zijn gespeld.
  2. Beter begrip code: het declareren van variabelen zorgt ervoor dat actief moet worden nagedacht over de waarden die de variabelen in een code kunnen aannemen. Dit kan leiden tot een beter begrip van de werking van de code.
  3. Verhogen snelheid: door het declareren van variabelen kan code sneller worden uitgevoerd. Vaak wordt tegengeworpen dat dit met de huidige snelle computers vrijwel geen rol van betekenis meer speelt. En ja, het klopt dat bij eenvoudige procedures het snelheidsverschil niet merkbaar is. Maar bij complexe procedures of procedures die veel rekenkracht vergen kan dit wel degelijk snelheidswinst opleveren. Test als voorbeeld onderstaande 2 procedures maar eens. De tweede procedure verloopt aanzienlijk sneller dan de eerste. Hoeveel sneller is per computer verschillend, maar het verschil kan al gauw enkele seconden zijn.
Sub NoVarDeclaration()
    t = Now
    For i = 1 To 100000000
        j = j + 1
        If j > 30000 Then j = 1
    Next i
    MsgBox (Now - t) * 86400 '86400=secondes per dag
End Sub
Sub WithVarDeclaration()
    Dim t As Double, i As Long, j As Integer
    t = CDbl(Now)
    For i = 1 To 100000000
        j = j + 1
        If j > 30000 Then j = 1
    Next i
    MsgBox (CDbl(Now) - t) * 86400 '86400=secondes per dag
End Sub

Er zijn ook een paar nadelen van het declareren van variabelen te noemen, maar die wegen in veel gevallen niet op tegen de voordelen:

  1. Extra type-werk: alle declaraties moeten worden ingetypt en dat is wat extra werk. Ook wordt de code hierdoor langer. Maar een voordeel is dat variabelen in de code sneller en foutloos kunnen worden ingevoerd. De variabelen verschijnen namelijk in de lijst die met Ctrl+Spatie kan worden opgeroepen. Als één of meer letters van de variabele zijn ingetypt dan wordt deze lijst beperkt tot de objecten die beginnen met de ingetypte letters. Als er maar een object voldoet, dan wordt deze direct ingevoerd.
  2. Foutmeldingen door onjuiste declaratie: een onjuiste declaratie van variabelen kan leiden tot foutmeldingen. Voorbeeld: een te groot getal willen opslaan in een integer, een tekst willen opslaan in een getal, enz. Bij juiste declaratie kan dit echter ook wijzen op een bug in het programma: er worden blijkbaar door het programma waarden gegenereerd die vooraf niet voorzien zijn. Het programma moet dan hierop worden aangepast.

Vragen / suggesties

Hopelijk heeft dit artikel geholpen bij een beter begrip van het declareren van variabelen in VBA. Als er verdere vragen over dit onderwerp zijn of suggesties voor verbetering, plaats dan een reactie hieronder.

Reacties  
# Jos van de Kamp 11-07-2022 08:10
Wat een duidelijk geschreven uitleg. Dit is een verademing vergeleken met menig andere site. Ik heb echter wel een vraag over de declaratie van String. In de tabel staat String(Vast) en String(Variabel). Hoe kan ik bij het declareren het verschil aangeven, ik heb namelijk genoeg een de optie Vast en wil die 10 bytes besparen.
Antwoorden
# Manfred van den Noort 11-07-2022 16:24
Jos, dank voor je reactie. Goed om te lezen dat je de uitleg duidelijk vindt.
Een string(Vast) kun je als volgt declareren:
Dim s As String * 5
Waarbij het getal uiteraard de lengte van de string bepaald. Houd er wel rekening mee dat hiermee alle waarden die toegekend worden aan deze variabele de lengte 5 krijgen. Dus strings die langer zijn worden afgekapt en kortere strings worden aangevuld met spaties totdat de opgegeven lengte bereikt is.
Antwoorden
# Arys Steven 17-11-2020 19:59
Ik wil hier lid worden om wat bij te leren.
Antwoorden
# Manfed van den Noort 18-11-2020 17:16
Lid worden kan (nog) niet. Misschien dat in de toekomst een optie wordt toegevoegd waarbij je je kunt abonneren, zodat je dan automatisch een mail krijgt als er een nieuw artikel is toegevoegd aan deze site.
Maar tot dan zou ik je adviseren om regelmatig deze site te bezoeken en te checken op nieuwe artikelen.
Antwoorden
arrow_up