Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Leer Gebruik van Ingebouwde Functies | VBA Fundamentals
Excel VBA voor Bedrijfsautomatisering

Gebruik van Ingebouwde Functies

Veeg om het menu te tonen

VBA wordt geleverd met enkele honderden ingebouwde functies, waarvan je de meeste nooit zult gebruiken. De onderstaande functies komen echter vaak voor bij bedrijfsautomatisering — het opschonen van tekst, werken met datums en het converteren van typen.

Datumfuncties

Debug.Print Now()                    ' current date and time
Debug.Print Date                     ' today's date only
Debug.Print DateAdd("d", 30, Date)   ' 30 days from today
Debug.Print DateDiff("d", #01/09/2023#, Date)  ' days since hire date
Debug.Print Format(Date, "dd/mm/yyyy")

Now() en Date lijken op elkaar maar beantwoorden verschillende vragen — Now() bevat de huidige tijd tot op de seconde nauwkeurig (handig voor het vastleggen van het tijdstip waarop een macro is uitgevoerd), terwijl Date alleen de kalenderdag geeft, wat je wilt gebruiken voor alles wat met vervaldatums of leeftijden te maken heeft. DateAdd en DateDiff zijn elkaars tegenpolen: DateAdd telt vooruit of achteruit vanaf een datum met een opgegeven eenheid ("d" voor dagen, maar "m" voor maanden en "yyyy" voor jaren werken ook), terwijl DateDiff het verschil tussen twee bestaande datums meet.

Note
Opmerking

VBA-datumliterals — alles wat tussen #-symbolen staat, zoals #01/09/2023# — gebruiken intern altijd de volgorde MM/DD/YYYY, ongeacht je Windows-regio-instellingen of systeemtaal. Dus #01/09/2023# betekent 9 januari 2023, niet 1 september, zelfs voor gebruikers die normaal DD/MM/YYYY gebruiken. Dit verschilt van hoe datums in een werkbladcel worden ingevoerd, waar regionale instellingen wel van toepassing zijn — het #...# literalformaat is een VBA-specifieke regel die altijd hetzelfde blijft, ongeacht waar de code wordt uitgevoerd.

Tekstfuncties

Debug.Print UCase("wireless mouse")     ' WIRELESS MOUSE
Debug.Print LCase("WIRELESS MOUSE")     ' wireless mouse
Debug.Print Left("P001", 1)             ' P
Debug.Print Right("P001", 3)            ' 001
Debug.Print Mid("P001", 2, 3)           ' 001
Debug.Print Trim("  Keyboard  ")        ' Keyboard
Debug.Print Len("Laptop Stand")         ' 12
Debug.Print InStr("Wireless Mouse", "Mouse")  ' 10 (position found)

UCase en LCase gebruik je om een vergelijking hoofdletterongevoelig te maken, bijvoorbeeld: If UCase(category) = UCase("electronics") Then werkt ongeacht hoe de categorie oorspronkelijk is getypt. Left, Right en Mid halen een deel van een tekenreeks op, waarbij het verschil zit in het startpunt: Left en Right tellen vanaf de uiteinden, terwijl Mid een startpositie en een lengte gebruikt. Daarom geven Mid("P001", 2, 3) en Right("P001", 3) hier toevallig hetzelfde resultaat — "P001" heeft slechts één cijfer als voorvoegsel, dus "vanaf positie 2" en "de laatste 3 tekens" komen op dezelfde substring uit. Trim verwijdert stilletjes spaties aan het begin en einde — een onopvallende functie die je vaak redt als gegevens zijn gekopieerd en geplakt met inconsistente spaties. InStr zoekt naar een tekenreeks binnen een andere en geeft de positie terug waar deze is gevonden (of 0 als deze niet voorkomt), wat handig is om te testen of een productnaam bijvoorbeeld het woord Mouse bevat zonder een exacte overeenkomst te vereisen.

Numerieke functies

Debug.Print Round(24.996, 2)   ' 25
Debug.Print Abs(-15)           ' 15
Debug.Print Int(7.9)           ' 7

Round en Int verkleinen beide een getal, maar op verschillende manieren — Round(24.996, 2) rondt af naar de dichtstbijzijnde waarde op 2 decimalen (25,00, weergegeven als 25), terwijl Int(7.9) altijd naar beneden afrondt richting nul, ongeacht hoe dicht het getal bij afronden naar boven is, en dus 7 geeft in plaats van 8. Deze verwisselen is een veelvoorkomende bron van prijsfouten: een prijs afronden op de dichtstbijzijnde cent moet bijna altijd met Round gebeuren, niet met Int, anders reken je systematisch te weinig per transactie.

Typeconversie

Cruciaal bij het ophalen van waarden uit een werkblad, omdat celwaarden vaak als Variant binnenkomen:

Dim priceText As String
priceText = "39.50"
Dim price As Double
price = CDbl(priceText)     ' text → number
 
Dim stockValue As Variant
stockValue = "44"
Dim stockCount As Integer
stockCount = CInt(stockValue)

CDbl converteert naar Double, CInt naar Integer, CStr converteert naar String en CDate converteert naar een geldige Date-waarde.

Waarom niet gewoon VBA automatisch laten converteren wanneer dat nodig is? Meestal gebeurt dat ook, maar daarop vertrouwen is riskant: een cel die eruitziet als een getal maar eigenlijk als tekst is ingevoerd of geïmporteerd, kan ervoor zorgen dat een If-vergelijking of een rekenkundige bewerking faalt of onverwacht gedrag vertoont. Expliciete conversie vangt dat vroegtijdig op, met een foutmelding precies op de regel waar de foutieve data zich bevindt, in plaats van pas drie stappen verderop.

Taak

  1. Schrijf een regel die alleen het numerieke gedeelte van "P003" extraheert met Mid (tip: begin bij positie 2).
  2. Schrijf een regel die die geëxtraheerde tekst omzet in een echt getal met CInt of CLng.
  3. Gebruik DateDiff om te berekenen hoeveel dagen geleden Emma Davis is aangenomen (15/03/2020) vergeleken met vandaag.
Hint
expand arrow

1. Het numerieke gedeelte extraheren

  • Mid neemt drie onderdelen: de tekenreeks zelf, waar je begint met tellen, en hoeveel tekens je wilt pakken.
  • "P003" heeft één letter gevolgd door drie cijfers — je wilt de "P" overslaan en alles erna pakken.
  • Startpositie 2 betekent "begin bij het 2e teken" — tel "P003" op je vingers om te bevestigen dat positie 2 de eerste "0" is.

2. Omzetten naar een echt getal

  • Wat Mid teruggeeft is nog steeds tekst, ook al lijkt het op een getal.
  • Zet de hele Mid(...)-expressie tussen CInt(...) of CLng(...) — je converteert het resultaat van de ene functie met een andere.
  • Herinnering uit een eerder hoofdstuk: CInt/CLng zetten tekst om in een geheel getal; gebruik CLng als je niet zeker weet of het getal ooit groot kan zijn.

3. Dagen sinds de aanstellingsdatum

  • DateDiff heeft drie dingen nodig: welke eenheid je wilt meten ("d" voor dagen), een begindatum en een einddatum.
  • Het lastige is het schrijven van een letterlijke datum in VBA — zet deze tussen #-symbolen, zoals #03/15/2020#. Binnen #...# verwacht VBA altijd de volgorde maand/dag/jaar, ongeacht je regionale instellingen — dus 15 maart is #03/15/2020#, niet #15/03/2020#.
  • Voor "vandaag" hoef je geen datum te typen — er is een sleutelwoord uit sectie 2.3 dat altijd de huidige datum teruggeeft.
  • Zet die twee datums in DateDiff in de juiste volgorde — de vroegste datum eerst — anders krijg je een negatief getal terug.
Was alles duidelijk?

Hoe kunnen we het verbeteren?

Bedankt voor je feedback!

Sectie 2. Hoofdstuk 3

Vraag AI

expand

Vraag AI

ChatGPT

Vraag wat u wilt of probeer een van de voorgestelde vragen om onze chat te starten.

Sectie 2. Hoofdstuk 3
some-alt