Tutorial VBA Variabelen declareren

  1. inleiding
  2. typen variabelen
  3. het Dim statement
  4. naamgeving
  5. Option Explicit
  6. werkgebied
  7. richtlijnen
  8. voor- en nadelen declareren

1. INLEIDING

Variabelen in VBA worden gebruikt om (tijdelijke) waarden in op de slaan. Het declareren van variabelen houdt in dat geheugenruimte voor deze variabele wordt gereserveerd. In deze tutorial 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. Dat zal ook aan de orde komen in deze workshop.

 

2. 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 -1,401298E-45 en positieve getallen van 1,401298E-45 tot 3,402823E38. 4 bytes 0 !
Double Dubbele precisie drijvende komma getallen. Negatieve getallen van -1,79769313486232E308 tot -4,94065645841247E-324 en positieve getallen van 4,94065645841247E-324 tot 1,79769313486232E308. 8 bytes 0 #
Currency Getallen van -922.337.203.685.477,5808 tot 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 ± 64500 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

 

3. HET DIM STATEMENT

Variabelen worden meestal gedeclareerd met het Dim statement. Bijvoorbeeld: “Dim sLocation as String”. sLocation 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. In onderstaand plaatje is een voorbeeld te zien van een declaratie van variabelen:

variabelen_declareren1_300x140

Variabele s is hierbij als een string gedeclareerd en i en j als integers. Voor variabele h 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 k, m en n gedeclareerd op één regel. Maar omdat alleen n gevolgd wordt door Byte is alleen n een Byte. Variabelen k en m 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%

 

4. 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.

 

5. 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, zoals ook in het plaatje uit de vorige paragraaf te zien is. 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_declareren2_310x180

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.

 

6. 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.

 

7. RICHTLIJNEN

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

  1. Kies bij een data type voor de type met het kleinste geheugengebruik. Het geheugengebruik staat vermeld in de tabel van paragraaf 2.
  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

 

8. 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=seconds per day
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=seconds per day
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.

 

Interesse in andere tutorials? Ga dan naar ons tutorials-overzicht of neem een kijkje op onze pagina met tips&trucs.

Reacties op onze tutorials en tips&trucs zijn van harte welkom. Dat kan door hieronder een reactie toe te voegen of door rechtstreeks contact met ons op te nemen.

6 reacties op VBA variabelen declareren

  • Ik hoop dat een boolean geen 2 byte groot ismaar 2 bit

    • Nee, een boolean is toch echt 2 bytes. In theorie zou natuurlijk 1 bit voldoende moeten zijn (die dan een 0 of 1 kan bevatten), maar variabelen worden opgeslagen en dus is de minimale waarde 1 byte. In de praktijk blijkt een boolean echter 2 bytes te zijn. Voor zover ik weet wordt dit veroorzaakt door een stuk historie. Vroeger bestond in VBA dit datatype niet en toen werd dit gevormd op basis van een datatype dat 2 bytes nodig had.

  • Hallo,

    Ik zit al geruime tijd te stoeien met onderstaande kode.
    het gaat om een document waarin meterstanden worden bijgehouden en berekenigen op worden gedaan.
    in een UserForm voor ik de meterstanden (deels gehele getallen en deels met comma) in wat dan in een sheet geplaatst moet worden. dat deel werkt perfekt. het gaat mis met de invoer controle: als er niets of een te laag getal wordt gevoerd. er moet dan een foutmelding worden gegeven.

    daar gaat het mis. als er niets of een te laag getal wordt invoerd krijg ik foutmelding 13. dat is Fout 13: Run-time error 13: Type mismatch.
    ik heb de gehele getallen declareerd als Integer en de getallen met een comma als Single. ook andere types geprobeerd maar dat geeft dezelfde fout. ik zie niet wel type ik moet gebruiken?

    Option Explicit
    
    Private Sub Annuleren_Click()
    'Dit is de routine van de konp "Annuleren"
    
        Unload Data_UF
    
    End Sub
    
    
    Private Sub MeterstandTerugHoog_Change()
    
    End Sub
    
    Private Sub MeterstandVerbrHoog_Change()
    
    End Sub
    
    Private Sub Toevoegen_Click()
    'als we de knop "toevoegen" klikken gaan de onderstaande routines in werking
    
    'varible declaratie blok
    Dim DoelRij As Integer 'de variabel voor de positiecontrole
    Dim LaatsteDatum As Date 'de variabel die de datum laatst ingegeven datum weergeeft
    Dim MeterstandVerbrLaag_Waarde As Integer 'de variabel die de meterstand verbruik laag weergeeft
    Dim MeterstandVerbrHoog_Waarde As Integer
    Dim MeterstandTerugLaag_Waarde As Integer
    Dim MeterstandTerugHoog_Waarde As Integer
    Dim OpgewektZonnepanelen_Waarde As Single
    Dim MeterstandGas_Waarde As Single
    Dim MeterstandWater_Waarde As Single
    
    'in dit blok krijgen de varibles hun waarden toegewezen
    DoelRij = Sheets("formules").Range("AN3").Value + 1
    LaatsteDatum = Datum
    MeterstandVerbrLaag_Waarde = MeterstandVerbrLaag
    MeterstandVerbrHoog_Waarde = MeterstandVerbrHoog
    MeterstandTerugLaag_Waarde = MeterstandTerugLaag
    MeterstandTerugHoog_Waarde = MeterstandTerugHoog
    OpgewektZonnepanelen_Waarde = OpgewektZonnepanelen
    MeterstandGas_Waarde = MeterstandGas
    MeterstandWater_Waarde = MeterstandWater
    
       
        'Hier wordt gecontroleerd op een dubbele invoer
        If Application.WorksheetFunction.CountIf(Sheets("Data").Range("A3:A10003"), LaatsteDatum) > 0 Then
            MsgBox "Er bestaat al een invoer op deze datum!", 0, "Check"
            Exit Sub
        End If
    '    'einde controle op dubbele invoer
    
        'hier begint het testen van de in gevoerde waarden: of ze leeg, kleiner of gelijk aan de vorige ingave zijn
        If MeterstandVerbrLaag_Waarde <= Sheets("Data").Range("Gegevens_Start").Offset(DoelRij - 1, 4).Value Then
            MsgBox "De ingevoerde waarde van van 'meterstand verbruik elektriciteit Laag' is leeg, kleiner of gelijk aan dat van de maand er voor!", 0, "invoer controle"
            Exit Sub
        End If
    
        If MeterstandVerbrHoog_Waarde <= Sheets("Data").Range("Gegevens_Start").Offset(DoelRij - 1, 5).Value Then
            MsgBox "De ingevoerde waarde van van 'meterstand verbruik elektriciteit Hoog' is leeg, kleiner of gelijk aan dat van de maand er voor!", 0, "invoer controle"
            Exit Sub
        End If
    
         If MeterstandTerugLaag_Waarde <= Sheets("Data").Range("Gegevens_Start").Offset(DoelRij - 1, 6).Value Then
            MsgBox "De ingevoerde waarde van van 'meterstand teruglevering elektriciteit Laag' is leeg, kleiner of gelijk aan dat van  de maand er voor!", 0, "invoer controle"
            Exit Sub
        End If
    
         If MeterstandTerugHoog_Waarde <= Sheets("Data").Range("Gegevens_Start").Offset(DoelRij - 1, 7).Value Then
            MsgBox "De ingevoerde waarde van van 'meterstand teruglevering elektriciteit Hoog' is leeg, kleiner of gelijk aan dat van  de maand er voor!", 0, "invoer controle"
            Exit Sub
        End If
    
         If OpgewektZonnepanelen_Waarde <= "0" Then
            MsgBox "Er is niets of een negatiefe waarde ingevoerd bij 'bruto opgewekt (Omnik Webportal)!", 0, "invoer controle"
            Exit Sub
        End If
    
         If MeterstandGas_Waarde <= Sheets("Data").Range("Gegevens_Start").Offset(DoelRij - 1, 9).Value Then
            MsgBox "De ingevoerde waarde van van 'meterstand verbruik gas' is leeg, kleiner of gelijk aan dat van de maand er voor!", 0, "invoer controle"
            Exit Sub
        End If
    
        If MeterstandWater_Waarde <= Sheets("Data").Range("Gegevens_Start").Offset(DoelRij - 1, 10).Value Then
            MsgBox "De ingevoerde waarde van van 'meterstand verbruik water' is leeg, kleiner of gelijk aan dat van de maand er voor!", 0, "invoer controle"
            Exit Sub
        End If
        'hier eindigt het testen van de in gevoerde waarden of ze leeg, kleiner of gelijk aan de vorige ingave zijn
        
        
        
        'vanaf hier worden de gegevens in de database ingegeven
        If MaandelijksVerbruik = True Then
             Sheets("Data").Range("Gegevens_Start").Offset(1, 22).Value = "Ja"
        Else
            Sheets("Data").Range("Gegevens_Start").Offset(1, 22).Value = "Nee"
        End If
            
        'MeterOpname
        Sheets("Data").Range("Gegevens_Start").Offset(DoelRij, 0).Value = Datum 'datum van de gegevens die ingevoerd worden
        Sheets("Data").Range("Gegevens_Start").Offset(DoelRij, 4).Value = MeterstandVerbrLaag 'meterstand electriciteit verbruik Laag tarief
        Sheets("Data").Range("Gegevens_Start").Offset(DoelRij, 5).Value = MeterstandVerbrHoog   'meterstand electriciteit verbruik Hoog tarief
        Sheets("Data").Range("Gegevens_Start").Offset(DoelRij, 6).Value = MeterstandTerugLaag   'meterstand electriciteit teruglevering Laag tarief
        Sheets("Data").Range("Gegevens_Start").Offset(DoelRij, 7).Value = MeterstandTerugHoog   'meterstand electriciteit teruglevering Hoog tarief
        Sheets("Data").Range("Gegevens_Start").Offset(DoelRij, 8).Value = OpgewektZonnepanelen  'opgewekt door de zonnepanelen volgens de webportal
        Sheets("Data").Range("Gegevens_Start").Offset(DoelRij, 9).Value = MeterstandGas 'meterstand verbruik gas
        Sheets("Data").Range("Gegevens_Start").Offset(DoelRij, 10).Value = MeterstandWater 'meterstand verbruik water
        Sheets("Data").Range("Gegevens_Start").Offset(DoelRij, 11).Value = Opmerking 'eventuele opmerking van toepassing op de invoer
        'einde van het toevoegen van de gegevens aan de database
        
        Unload Data_UF
        
        'controle bericht voor de gebruiker
        MsgBox "De gegevens van " & LaatsteDatum & " " & " zijn toegevoegd en het formulier wordt afgesloten", 0, "Message"
    
    
    End Sub
    
    Private Sub UserForm_Click()
            
    End Sub
    
    
    
    • Dag Willem,
      Zonder bestand is dat lastig te beoordelen, temeer omdat je ook niet aangeeft op welke regel het precies misgaat. Maar de foutmelding treedt in ieder geval op als een textbox leeg is. Je probeert dan de lege waarde van een textbox (dat is een lege string) toe te wijzen aan de integer of single en dan krijg je een Type Mismatch-error. In jouw code zul je dus eerst moeten checken op een lege checkbox, voordat je de waarde toekent aan een variabele.
      Groeten, Manfred

  • Goedemorgen,
    Als ik de volgende variabelen declareer accepteert hij de variabele rapportage niet, deze staat in kolom F.

    Dim laatsteRij As Long 'de laatste rij die door het formulier wordt gevuld
    Dim prijs As String 'er komt een vaste prijs uit en zo kan ik hem ook in Word opnemen
    Dim rapportage As Boolean 'waar of niet waar
    Dim m2 As Integer 'waarde wordt max 1500
    
    laatsteRij = Range("A1").CurrentRegion.Rows.Count
    ActiveCell = Cells(laatsteRij, 9) 'deze wordt niet als foutmelding gegeven
    rapportage = Cells(laatsteRij, 6) 'deze krijgt als foutmelding dat de typen niet met elkaar overeenkomen

    Ik zou zeer geholpen zijn met een antwoord.
    Alvast dank!

    • Hallo Noortje,

      De foutmelding krijg je als in Cells(laasteRij,6) een waarde staat die niet geconverteerd kan worden naar een Boolean. Meestal gaat het dan om een tekst. Getallen kunnen wel geconverteerd worden naar een Boolean, waarbij 0 False is en de rest True. Ook WAAR/ONWAAR in de cel (of bij een engelse versie TRUE/FALSE) geeft uiteraard geen problemen, want dat komt het meest overeen met een Boolean.
      Daarnaast valt de coderegel met ActiveCell mij op. Hoewel dit geen foutmelding geeft, is dit geen normale werkwijze met ActiveCell. Wat wil je met deze regel bewerkstelligen?

      Groet, Manfred

Geef een reactie

Het e-mailadres wordt niet gepubliceerd.