Feiertage berechnen und berücksichtigen - Teil 2

Prüfen, ob ein Datum ein fester Feiertag ist

Die Methode, die prüft, ob ein bestimmter Tag ein fester Feiertag ist, muss nun das Array durchlaufen und prüfen, ob das zu prüfende Datum im Array vorkommt. Wichtig ist, dass die Methode erst aufgerufen wird, wenn das Array gefüllt ist. Das können Sie am einfachsten sicherstellen, wenn die Methode dies zuvor prüft und ansonsten die Prozedur FeiertageLesen aufruft (Listing 3).

Public Function FixFeiertag(datDatum As Date, _
strDateiname As String, Optional strLand) As String
'Prüft ob es sich bei dem Datum um einen fixen Feiertag handelt
'Falls ja, wird der Name des Feiertags zurückgegeben
Dim bytFehler As Byte
Dim bytTag As Byte
Dim bytMonat As Byte
Dim lngZage
bytFehler = 0
FixFeiertag = ""
On Error GoTo FEHLER
If UBound(arrFTage) >= 0 Then
'Array durchsuchen
bytTag = Day(datDatum)
bytMonat = Month(datDatum)
For lngZeile = LBound(arrFTage) To UBound(arrFTage)
typFTag = arrFTage(lngZeile)
If IsMissing(strLand) Then
If (bytTag = typFTag.Tag) And (bytMonat = typFTag.Monat) Then
FixFeiertag = typFTag.Name
Exit For
End If
Else
If (bytTag = typFTag.Tag) And (bytMonat = typFTag.Monat) _
And (strLand = typFTag.Land) Then
FixFeiertag = typFTag.Name
Exit For
End If
End If
Next lngZeile
End If
Exit Function
FEHLER:
bytFehler = bytFehler + 1
If Err.Number = 9 Then
If bytFehler = 1 Then
FeiertageLesen strDateiname
Resume
Else
Exit Function
End If
End If
End Function

Zunächst sorgt die Anweisung On Error Goto FEHLER dafür, dass bei einem Laufzeitfehler zur Fehler-Marke gesprungen wird. Das ist wichtig, weil bei einem noch nicht initialisierten Array das Abrufen der oberen Indexgrenze mit ubound einen Laufzeitfehler verursacht. Anhand dieses Fehlers können Sie aber erkennen, dass das Array noch gefüllt werden muss. Dazu fragt die Fehlerbehandlungsroutine die Fehlernummer ab. Ist dies die Zahl 9, war das Array noch nicht initialisiert und die Prozedur FeiertageLesen wird aufgerufen. Sollte die Fehlerbehandlungsroutine zweimal aufgerufen werden, wird die Funktion mit Exit Sub verlassen. Kann die Funktion nach der Fehlerbehandlung oder weil kein Fehler aufgetreten ist fortgesetzt werden, wird das Array durchsucht. Dazu wird zunächst aus dem Parameter datDatum der Tag und der Monat ermittelt und in zwei Variablen gespeichert. Danach durchläuft eine Schleife das Array. Für den Fall, dass der optionale Parameter strLand nicht übergeben wurde, wird nur geprüft, ob Monat und Tag des aktuellen Array-Eintrags mit den Werten in den beiden Variablen übereinstimmen. Wird zusätzlich das Land angegeben, wird auch dieses in die Prüfung einbezogen. Innerhalb der If-Verzweigungen wird dann der Name des Feiertags als Rückgabewert festgelegt. Wird keine Übereinstimmung gefunden, gibt die Funktion eine leere Zeichenfolge zurück.

Methode anpassen

Da die Funktion FixFeiertag gegenüber der ursprünglichen Planung aus dem ersten Teil der Artikelfolge um einen Parameter für den Dateinamen ergänzt wurde, müssen Sie die bereits definierte Methode IstFeiertag dahingehend anpassen, dass Sie den Else-Zweig aus der Methode löschen, wie dies in Listing 6 geschieht.

Public Function IstFeiertag(ByRef datDatum As Date, ByRef strName As String) _
As Boolean
...
ElseIf Muttertag(lngJahr) = datDatum Then
strName = "Muttertag"
IstFeiertag = True
End If
End If
End Function