Feiertage berechnen und berücksichtigen - Teil 1

Die Klasse erstellen

Um eine solche Klasse zu erstellen, fügen Sie in Ihre Access-Datenbank innerhalb der Entwicklungsumgebung mit Einfügen/Klassenmodul ein Klassenmodul ein und setzen dessen Name Eigenschaft auf clsFeiertage. Innerhalb der Klasse erstellen Sie eine öffentliche Funktion Ostersonntag() (Listing 1), der Sie als Parameter die Jahreszahl übergeben. Damit ist schon die erste Variable der Formel bekannt.

Public Function Ostersonntag(lngJahr As Long) As Variant
Dim strFehler As String
Dim lngTag As Long
Dim bytMonat As Byte
Dim bytA As Byte
Dim bytB As Byte
Dim bytM As Byte
Dim bytN As Byte
Dim lngE As Long
Dim lngD As Long
'Berechnen von A, B und C
bytA = lngJahr Mod 19
bytB = lngJahr Mod 4
bytC = lngJahr Mod 7
'Ermitteln von M und N
bytM = 0
bytN = 0
strFehler = getMundN(bytM, bytN, lngJahr)
If strFehler = "" Then
'Berechnung fortsetzen
'Berechnen von D
lngD = ((19 * bytA) + bytM) Mod 30
lngE = ((2 * bytB) + (4 * bytC) + (6 * lngD) + bytN) Mod 7
'Tag berechnen
lngTag = 22 + lngD + lngE
'Ausnahmen prüfen
'Ist Ostersonntag größer als 31, fällt Ostern in den April.
'Der Tag wird dann wie folgt berechnet: Ostersonntag =D+E-9.
If lngTag > 31 Then
bytMonat = 4
lngTag = lngD + lngE - 9
'weitere Ausnahmen prüfen
If lngTag = 26 Then
'Ist Ostersonntag der 26. April fällt Ostern
'auf den 19. April
lngTag = 19
ElseIf lngTag = 25 Then
'Ist Ostersonntag der 25. April und gleichzeitig
'A > 10 und D = 28, dann ist Ostersonntag der 18. April
If (bytA > 10) And (bytB = 28) Then
lngTag = 18
End If
End If
Else
bytMonat = 3
End If
End If
'Gültigkeitsprüfung durchführen
'Prüfen, ob das Datum gültig ist.
If (bytMonat > 0) And (lngTag > 0) Then
Ostersonntag = DateSerial(lngJahr, bytMonat, lngTag)
'prüfen, ob das berechnete Datum ein Sonntag ist.
If Weekday(Ostersonntag, vbSunday) > 1 Then
strFehler = "Berechnungsfehler: Ostersonntag " & _
"liegt nicht an einem Sonntag!"
Ostersonntag = strFehler & vbCrLf & "Berechnungergebnis: " _
& Format(Ostersonntag, "dd.MM.yyyy", vbSunday)
End If
Else
Ostersonntag = strFehler
End If
End Function
Private Function getMundN(ByRef bytM As Byte, ByRef bytN As Byte, _
lngJahr As Long) As String
getMundN = ""
Select Case lngJahr
Case 1582 To 1699:
bytM = 22
bytN = 2
Case 1700 To 1799:
bytM = 23
bytN = 3
Case 1800 To 1899:
bytM = 23
bytN = 4
Case 1900 To 2099:
bytM = 24
bytN = 5
Case 2100 To 2199:
bytM = 24
bytN = 6
Case 2200 To 2299:
bytM = 25
bytN = 0
Case 2300 To 2399:
bytM = 26
bytN = 1
Case 2400 To 2499:
bytM = 25
bytN = 1
Case Else
getMundN = "Die Jahreszahl muss zwischen 1581 und 2500 liegen!"
End Select
End Function

Am Anfang der Methode definieren Sie zunächst die benötigten Variablen und berechnen die Variablen A, B und C aus der Formel. Anschließend werden die Variablen bytM und bytN auf 0 gesetzt. Diese Variablen übergeben Sie dann die Funktion getMundN, die die Werte für M und N gemäß Tabelle 1 berechnet und zurückgibt. Damit zwei Werte von einer Funktion zurückgegeben werden können, werden diese als Referenz übergeben und so über die Parameter der Funktion zurückgegeben. Der Rückgabewert derFunktion ist eine leere Zeichenfolge, falls alles in Ordnung ist, oder eine Fehlermeldung.

Haben Sie durch Aufruf der Funktion die Werte für die Variablen bytM und bytN berechnet, prüfen Sie den Rückgabewert der Funktion. Ist dieser eine leere Zeichenkette, führen Sie die Berechnungdurch.