Menu Sluiten

Alle beste datum/tijd VBA functies op een rij

datum tijd vba macro

In dit artikel gaan wij het hebben over hoe je omgaat met het data type datum en tijd binnen VBA. Van alle verschillende soorten data in VBA heb ik in de praktijk de meeste problemen gehad met het type datum. Dit had vaak te maken met het feit dat datums binnen Excel niet altijd herkend worden als datums, maar gezien worden als string (tekst). Ik zal hier verderop in dit artikel een praktijkvoorbeeld van laten zien. We beginnen eerst met het behandelen van de datum en tijd gerelateerde functies die je in een macro kunt gebruiken. Dat zijn er veel. In de praktijk zijn er echter veel die je niet zult gebruiken. In dit artikel behandel geef ik een uitgebreide beschrijving van de functies die ik in de praktijk vaak gebruik.

Date

Deze functie geeft je de systeemdatum terug. Die kun je bijvoorbeeld opslaan in een variabele voor verdere bewerking. Hieronder een voorbeeld van hoe je deze functie kunt gebruiken in een code en wat de uitkomst is van de msgbox.

Sub datumophalen()

    datum = Date
    MsgBox datum

End Sub

Now

Deze functie lijkt op de date functie echter deze geeft naast de systeemdatum ook de systeemtijd terug.

Sub datumPlusTijdophalen()

    datum = Now
    MsgBox datum

End Sub

Verschillende functies voor eenheden in datums en tijd

Er zijn een veelfuncties waarbij je de eenheden datum en tijd kunt bepalen aan de hand van een datum die je meegeeft. Let erop dat het datatype van de output in dit geval geen ‘date’ is maar een ‘integer’ omdat het gaat om één getal:

  • Year functie – geeft een jaartal terug
  • Month functie – geeft een maandnummer terug
  • Weekday functie – geeft de dag van de week terug 

Uit het hele rijtje is Weekday de enige functie die nog verdere uitleg behoeft. Ik heb dit artikel namelijk geschreven op een donderdag. De uitkomst van de onderstaande code is een msgbox die het cijfer 5 teruggeeft. Dit komt omdat deze functie de zondag als dag één van de week ziet.

Sub Weekdagophalen()

    weekdag = Weekday(Date)
    MsgBox weekdag

End Sub
  • Day functie – geeft de dag van de maand terug
  • Hour functie – geeft het uur van de dag terug
  • Minute functie – geeft de minuut binnen het uur terug
  • Second functie – geeft de seconde binnen de minuut terug

Dateserial functie

Dit is de functie die ik in de praktijk het meest toepas. Je kunt met deze functie apart de dag, maand en jaar als input meegeven om als output een datum te genereren. Die input kan bestaan uit harde getallen die je meegeeft maar je kunt hier ook variabelen meegeven. In de onderstaande afbeelding kun je zien dat je dus eerst het jaar dient mee te geven, dan de maand en tenslotte de dag.

Deze functie heeft ook een mooie oplossing om de laatste dag van een bepaalde maand te vinden. Het is namelijk zo dat niet elke maand evenveel dagen heeft. Door bij de maand één maand op te tellen en dan bij dag het getal nul in te vullen schakelt hij terug naar de laatste dag van de maand ervoor.

Sub DeDateSerialFunctie()

    datum = DateSerial(2022, 3, 0)
    MsgBox datum

End Sub

De bovenstaande code geeft dus een msgbox die de datum 28-02-2022 laat zien.

Voorbeeld van problemen met het uitlezen van datums

In de bovenstaande voorbeelden die ik gebruikt heb om te laten zien hoe de verschillende datum en tijd functies werken maakte ik vooral gebruik van de date functie om een datum mee te geven. In dit geval werken de functies altijd goed omdat de date functie een goede datum van het juiste type genereert. Het kan echter ook zijn dat je met datums moet werken uit een bepaald systeem die anders geformatteerd staan dan een datum type. Stel bijvoorbeeld dat het systeem een datum als tekst meegeeft en daarin de notatie ‘m/d/yyyy’ gebruikt. Als je dit in een variabele stopt zul je zien dat VBA de data herkent als Variant/String en dat je deze datum dus ook niet kunt bewerken.

In dit geval kan de hierboven beschreven Dateserial functie echt een uitkomst bieden. Ik zal je een trucje laten zien waarbij ik gebruik maak van een string functie om alsnog een datum te kunnen bepalen aan de hand van deze systeemoutput.

Sub DatumIssue()

    datum = ThisWorkbook.Sheets("Blad1").Range("B2")

    If InStr(Left(datum, 2), "/") = 0 Then
        maand = Left(datum, 2)
        If InStr(Mid(datum, 4, 2), "/") = 0 Then
            dag = Mid(datum, 4, 2)
        Else
            dag = Mid(datum, 4, 1)
        End If
    Else
        maand = Left(datum, 1)
        If InStr(Mid(datum, 3, 2), "/") = 0 Then
            dag = Mid(datum, 3, 2)
        Else
            dag = Mid(datum, 3, 1)
        End If
    End If
    
    jaar = Right(datum, 2)
    
    datum = DateSerial(jaar, maand, dag)
    MsgBox datum

End Sub

De uitdaging met deze datum in tekst vorm is dat de dag en de maand uit één of twee cijfers kunnen bestaan. Wat ik hierboven heb gedaan is met behulp van de LEFT, MID en RIGHT functies gekeken of een deel van de tekst een slash bevat of niet. Dan kun je bepalen of een dag of maand uit één of twee cijfers bestaat. Vervolgens heb ik de dag, maand en jaar afzonderlijk opgeslagen als het type ‘integer’ in een variabele. Tenslotte kun je deze gegevens als input weer gebruiken in de Dateserial functie die deze data weer samen brengt tot een datum.

Formatteren van datums

Indien je de formattering van een datum wilt veranderen kun je dit doen met de format functie.

Sub Datumformatteren()

    datum = Format(Date, "D-M-YYYY")
    MsgBox datum

End Sub

Je hebt veel verschillende formatteringsopties om jouw datum vorm te geven zoals jij hem wilt zien. Op deze pagina kun je een lijst vinden met alle datum en tijd eenheden die je kunt toepassen binnen je format. Je kunt met de format functie ook gemakkelijk de dag, maand en jaar ophalen net zoals wij eerder in dit artikel hebben gedaan met behulp van de Day, Month en Year functie. Zo haal je bijvoorbeeld de dag uit een datum.

Sub Datumformatteren()

    dag = Format(Date, "D")
    MsgBox dag

End Sub

Ik hoop dat je nu een goed beeld hebt over hoe om te gaan met datums en tijd binnen VBA. Mocht je toch nog een vraag hebben. Laat het weten in de reacties!

Converteren van datums

Excel is behoorlijk krachtig als het gaat om het herkennen van datums in stringformaat. Dankzij zijn geavanceerde functies en intelligentie kan het programma vaak een tekststring herkennen die een datum voorstelt en deze automatisch converteren naar het standaard datumformaat.

Wanneer je bijvoorbeeld een string als “21 december 2022” invoert in een Excel-cel, merk je dat Excel het vaak automatisch herkent als een datum. Afhankelijk van de instellingen van je regionale systeem en Excel, zal het programma dit omzetten en weergeven in een specifiek formaat, bijvoorbeeld “21-12-2022”. Excel’s vermogen om een breed scala aan datumformaten te herkennen, zoals “21/12/2022”, “December 21, 2022”, “21 Dec 2022” en vele anderen, maakt het een flexibel en krachtig hulpmiddel.

Met behulp van de Isdate functie kun je tevens controleren of Excel in een bepaalde string een datum herkent. De output van deze functie is een boolean dus TRUE of FALSE

Heeft dit artikel je geholpen?

9 reacties

  1. Pingback:De verschillende soorten variabelen in VBA - Macro Excel Advies

  2. W.Jonkmans

    Ik moet de artikelen nog wel geheel goed doornemen, Maar voorzover nu te overzien lijkt mij de wijze van uw presentatie duidelijk.
    Het is lang geleden dat ik met programmeren te maken had. (10/12 jaar) Dus daar valt weer wat te leren op de oude dag. Die uitdaging ga ik gewoon weer eens aan.

    • MartinR

      Hoi W. Jonkmans,

      Hartelijk dank voor je bericht! Heel veel succes met de nieuwe uitdaging en mocht ik je ergens mee kunnen helpen dan hoor ik graag van je.

      Mvg,

      Martin

  3. Flor Veeckman

    Beste Martin,

    Ik ben op zoek naar code om het volgende resultaat te bekomen:

    1) Indien een cel in kolom A wordt aangepast zou ik de datum (en eventueel uur) van wijziging willen zien op dezelfde rij in kolom M.
    2) Uitgebreider: is dit ook mogelijk maar met met een grotere range? (Datum weergeven in kolom M voor alle wijzigingen in Kolom A tot en met F).

    Alvast bedankt om dit te bekijken.

    • MartinR

      Hoi Flor,

      Alles wat je vraagt is zeker mogelijk. Je plaatst dan een change event in je worksheet. Binnen dit change event definieer je met een IF statement bij welke cel of binnen welke range de actie (het noteren van datum/tijd) uitgevoerd dient te worden.

      Hoe je de change event plaatst kun je hier vinden.

      Tenslotte kun je in dit artikel alles vinden over hoe je datum en tijdswaarden op kunt halen.
      Het enige onderdeel wat dan nog een uitdaging kan vormen in mijn optiek is een datum en tijd in die in een bepaalde kolom rechts van de cel terecht moet komen die je wijzigt.
      Je kunt dit doen met behulp van een ‘offset’. Als je bijvoorbeeld ‘Target.Offset(, 5)’ typt dan definieer je hiermee 5 kolommen rechts van de cel die je aanpast.
      Een alternatieve methode is door een range te gebruiken en daarbij de rij op te halen van de target cel. Dit doe je op deze manier: ‘Blad1.Range(“M” & Target.Row & “:M” & Target.Row) = datum & uur’

      Ik hoop dat je er zo uit komt. Mocht het niet lukken hoor ik het wel 🙂

      Mvg,

      Martin

  4. Djuri van de Corput

    Hallo,

    Ik kan het hier niet goed vinden of weet niet waar ik het moet zoeken.
    Ik ben op zoek naar een VBA die er voorzorgt dat de datum geplaatst wordt in een cel.

    Voorbeeld:
    Ik heb verschillende mappen waar heel veel regels in staan. zodra er dubbel geklikt wordt op een bepaalde cel worden een aantal cellen gekoppieerd en naar een overzicht geplaatst. Als deze regel bij overzichten geplaatst wordt wil ik dat er achter de regel automatisch de huidige datum geplaatst wordt.

    Welke VBA heb ik hier voor nodig?

    Djuri

    • MartinR

      Hoi Djuri,

      Via deze site geef ik gratis adviezen voor mensen die zelf met VBA willen leren en ergens tegenaan lopen. Echter werk ik niet het probleem volledig uit.
      Ik geef alleen zetjes in de goede richting ;). In jouw geval klinkt het alsof jij iets wilt laten programmeren. Als je dat wilt dan kan ik dat voor jou doen. Dit klinkt vrij eenvoudig.
      Stuur mij dan het bestand en een gedetailleerde beschrijving van wat je exact wilt dat er gedaan moet worden naar info@macroexcel.nl.

      Mvg,

      Martin

  5. Sandra

    Dag Martin,

    Ik heb een datumkolom waarin iedere 1e dag van de maand is ingevoerd (1-1-2024). Deze wordt op scherm getoond als jan-2024. Nu wil ik een VBA maken die naar de cel van de huidige datum springt. Hij moet dus jun-2024 vinden omdat het vandaag 2 juni 2024 is.

    • MartinR

      Hoi Sandra,

      Je kunt dit doen door de huidige dag op te halen en toe te kennen aan een variabele.
      Als je bijvoorbeeld je variabele ‘datum’ noemt doe je dit zo: “datum = date”

      Vervolgens kun je de dateserial functie gebruiken om vanuit deze datum naar de 1e dag van de maand te komen.

      Tenslotte gebruik je dan de range.find functie om in de datum kolom te zoeken naar deze datum.
      Als je deze functie combineert met een ‘select’ dan wordt de cel met de gevonden datum geselecteerd.

      Mvg,

      Martin

Geef een reactie

Je e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *