Dag Riekkes,
Indien je niet wil dat de keuringsdatum in het weekend en of op een Belgische betaalde feestdag valt op de eerste dag van de maand:
Private Function IsFeestdag(ByVal checkDatum As Date) As Boolean
Dim feestdagen(1 To 5) As Date
Dim jaar As Integer
jaar = Year(checkDatum)
' Bepaal de feestdagen voor het opgegeven jaar
'De feestdagen die mogelijks op de eerste dag van de maand kunnen vallen:
feestdagen(1) = DateSerial(jaar, 1, 1) 'nieuwjaar
feestdagen(2) = DateAdd("d", 1, BerekenPasen(jaar)) 'paasmaandag
feestdagen(3) = DateSerial(jaar, 5, 1) 'dagVanDeArbeid
feestdagen(4) = DateAdd("d", 50, BerekenPasen(jaar)) 'pinkstermaandag
feestdagen(5) = DateSerial(jaar, 11, 1) 'allerheiligen
' Controleer of de datum overeenkomt met een van de feestdagen
Dim i As Integer
For i = LBound(feestdagen) To UBound(feestdagen)
If checkDatum = feestdagen(i) Then
IsFeestdag = True
Exit Function
End If
Next i
IsFeestdag = False
End Function
Private Function BerekenPasen(ByVal jaar As Integer) As Date
Dim a As Integer
Dim b As Integer
Dim c As Integer
Dim d As Integer
Dim e As Integer
Dim f As Integer
Dim g As Integer
Dim h As Integer
Dim i As Integer
Dim k As Integer
Dim l As Integer
Dim m As Integer
Dim p As Integer
Dim q As Integer
'algoritme van Gauss
a = jaar Mod 19
b = jaar \ 100
c = jaar Mod 100
d = b \ 4
e = b Mod 4
f = (b + 8) \ 25
g = (b - f + 1) \ 3
h = (19 * a + b - d - g + 15) Mod 30
i = c \ 4
k = c Mod 4
l = (32 + 2 * e + 2 * i - h - k) Mod 7
m = (a + 11 * h + 22 * l) \ 451
p = (h + l - 7 * m + 114) Mod 31
q = h + l - 7 * m + 114 \ 31
BerekenPasen = DateSerial(jaar, q, p + 1)
End Function
Public Function BerekenVolgendeKeuring(ByVal startDatum As Date, ByVal aantalJaren As Integer) As Date
Dim volgendeKeuring As Date
volgendeKeuring = DateAdd("yyyy", aantalJaren, startDatum) ' Voeg het aantal jaren toe aan de startdatum
' Controleer of de volgende keuringsdatum in het weekend of op een feestdag valt
Do While Weekday(volgendeKeuring) = vbSaturday Or Weekday(volgendeKeuring) = vbSunday Or IsFeestdag(volgendeKeuring)
volgendeKeuring = DateAdd("d", 1, volgendeKeuring) ' Verschuif naar de volgende dag
Loop
' Rond de datum af naar de eerste dag van de volgende maand
volgendeKeuring = DateSerial(Year(volgendeKeuring), Month(volgendeKeuring) + 1, 1)
' Controleer opnieuw of de volgende keuringsdatum in het weekend of op een feestdag valt
Do While Weekday(volgendeKeuring) = vbSaturday Or Weekday(volgendeKeuring) = vbSunday Or IsFeestdag(volgendeKeuring)
volgendeKeuring = DateAdd("d", 1, volgendeKeuring) ' Verschuif naar de volgende dag
Loop
BerekenVolgendeKeuring = volgendeKeuring
End Function
Je plakt bovenstaande code in een module.
In een query roep je de functie aan:
Herkeuring: Format(BerekenVolgendeKeuring([Startdatum];[JaarInterval]);"dddd dd/mm/yyyy")
Resultaat: maandag 3/01/2028
1/1/2028 valt op een zaterdag vandaar eerst volgende werkdag is dan maandag 3 januari 2028.
De feestdagen die mogelijks op de eerste dag van de maand kunnen vallen werken dynamisch dus zal zich naargelang het jaar automatisch aanpassen.
In bijlage een voorbeeldje.
Diezel