Home > Artikel > Ausgabe 2/2013 > Feiertage ermitteln, Teil 2

Feiertage ermitteln, Teil 2

Achtung: Sie sind nicht angemeldet. Wenn Sie Abonnent sind und sich anmelden, lesen Sie den kompletten Artikel, laden das PDF herunter oder probieren die Beispieldatenbank aus (sofern vorhanden).

Im ersten Teil dieser Artikelreihe haben Sie die Tabelle zum Speichern der Basisdaten der Feiertage sowie die Formulare zum Verwalten der Feiertage sowie für die Zuordnung zu den Bundesländern kennengelernt. Im vorliegenden zweiten Teil schauen wir uns an, wie die flexiblen Feiertage ermittelt werden und wie Sie aus den ermittelten Informationen eine Liste der Feiertage für einen bestimmten Zeitraum erstellen können.

Beispieldatenbank

Die Beispiele dieses Artikels finden Sie in der Datenbank 1302_FeiertageErmitteln.mdb.

Fixe und flexible Feiertage

Die fixen Feiertage finden immer am gleichen Datum statt: Neujahr am 1. Januar, Heilige drei Könige am 6. Januar, der Maifeiertag am 1. Mai et cetera. Diese vermerken wir in der Tabelle tblFeiertageBasis, indem wir den Namen des Feiertags eintragen, den Tag und den Monat festlegen, das Feld TageBisStichtag leer lassen und das Feld FeiertagArt mit Datum konstant füllen (siehe Bild 1).

Basisdaten zu den Feiertagen

Bild 1: Basisdaten zu den Feiertagen

Für die flexiblen Feiertage, von denen es zwei Varianten gibt, tragen wir ebenfalls den Feiertagnamen ein. Für den Tag und den Monat legen Sie allerdings jeweils den Wert 0 fest. Dafür tragen Sie im Feld TageBisStichtag einen Zahlenwert ein, der angibt, wieviele Tage der Feiertag vor oder hinter dem jeweiligen fixen Tag liegt. Um festzulegen, um welche Variante der flexiblen Feiertage es sich handelt, tragen Sie unter Feiertagsart entweder Abstand zu Stichtag Ostersonntag konstant oder Abstand zu Stichtag Vierter Advent konstant ein.

Stichtage für flexible Feiertage

Nun benötigen wir noch die Stichtage für die beiden flexiblen Feiertage, und zwar für Ostersonntag und für den vierten Advent. Im Falle des vierten Advents ist dies einfach: Es handelt sich dabei um den letzten Sonntag vor dem ersten Weihnachtsfeiertag. Um diesen Stichtag zu berechnen, verwenden Sie die Funktion aus Listing 1. Die Prozedur erwartet die Zahl des zu untersuchenden Jahres als Parameter mit dem Datentyp Integer (für Werte bis 32.767) und liefert einen Wert des Typs Date zurück (siehe Bild 2).

Test der Funktion zum Ermitteln des vierten Advents

Bild 2: Test der Funktion zum Ermitteln des vierten Advents

Die Funktion füllt eine temporäre Variable namens datTemp mit einem Datum, dass dem 24. Dezember des angegebenen Jahres entspricht. Dazu setzt es die Zeichenkette 24.12. und die mit der Variablen lngJahr übergebene Jahreszahl zusammen und konvertiert den Ausdruck mit der Funktion CDate zu einem Datumswert zusammen.

Dies könnten Sie theoretisch auch mit der DateSerial-Funktion erledigen. Die entsprechende Zeile sieht dann wie folgt aus:

datTemp = DateSerial(intJahr, 12, 24)

Nun startet die Prozedur eine Do While-Schleife. Diese wird solange durchlaufen, bis der Wochentag des in datTemp gespeicherten Datums dem Sonntag entspricht. Innerhalb der Schleife zieht die Funktion mit jedem Durchlauf einen Tag vom Datum ab.

Im Jahr 2012 etwa fiel Heiligabend auf einen Montag, der vierte Advent dementsprechend auf den Sonntag davor. Die Funktion prüft beim ersten Aufruf der Do While-Zeile, ob der Wochentag des Datums den Wert vbSunday zurückliefert. Das ist im ersten Durchlauf des Beispiels für 2012 nicht der Fall, stattdessen liefert die Weekday(datTemp) für den 24.12.2012 den Wert 2 (vbMonday). Also ist die Abbruchbedingung nicht erfüllt und der in der Schleife enthaltene Befehl wird durchlaufen. Dieser subtrahiert vom in datTemp gespeicherten Wert die Zahl 1 – dies entspricht genau einem Tag (Tage sind ganze Zahlen, Uhrzeiten der Bereich hinter dem Komma). Im nächsten Durchlauf hat datTemp den Wert 23.12.2012 und Weekday liefert den gewünschten Wert 1 (vbSunday). Die Abbruchbedingung ist erfüllt und die Schleife wird kein weiteres Mal durchlaufen.

Schließlich stellt die Funktion datTemp als Wert der Rückgabevariablen VierterAdvent ein (gleichzeitig Funktionsname).

Berechnung des Datums des Ostersonntags

Die Berechnung des Ostersonntags ist etwas komplizierter als die des vierten Advents. Um ehrlich zu sein: Wir sollten die Formel zur Berechnung, die durch die Funktion aus Listing 2 abgebildet wird, einfach hinnehmen.

Public Function Ostersonntag(intJahr 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 intTag As Integer

     Dim intMonat As Integer

     a = intJahr Mod 19

     b = intJahr Mod 4

     c = intJahr Mod 7

     d = (19 * a + 24) Mod 30

     e = (2 * b + 4 * c + 6 * d + 5) Mod 7

     intTag = 22 + d + e

     intMonat = 3

     If intTag > 31 Then

         intTag = d + e - 9

         intMonat = 4

     End If

     Ostersonntag = intTag & "." & intMonat & "." & intJahr

End Function

Listing 2: Berechnung des Datums des Ostersonntags

Allein eine in der Routine enthaltene VBA-Funktion wollen wir kurz inspizieren – dabei handelt es sich um die Mod-Funktion. Diese ist eigentlich eher ein Operator als eine Funktion, denn die beiden Parameter werden durch das Schlüsselwort Mod verbunden. Mod liefert den Rest der Division des ersten und des zweiten genannten Zahlenwertes. 3 Mod 2 würde also entsprechend den Wert 1 zurückgeben. Desweiteren liefert die Funktion genau das Datum des Ostersonntags für das im Parameter angegebene Jahr zurück.

Datum nach Feiertag und Bundesland

Kommen wir zum Ermitteln der eigentlichen Feiertagsdaten für die gewünschten Feiertage und Bundesländer.

Die Hauptarbeit erledigt dabei die Funktion aus Listing 3. Diese erwartet drei Parameter:

Public Function FeiertagErmitteln(lngFeiertagID As Long, lngBundeslandID As Long, intJahr As Integer)

     Dim db As DAO.Database

     Dim rst As DAO.Recordset

     Dim strKriterium As String

     Dim datTemp As Date

     Set db = CurrentDb

     strKriterium = "FeiertagID = " & lngFeiertagID & " AND BundeslandID = " & lngBundeslandID

     Set rst = db.OpenRecordset("SELECT * FROM qryFeiertage WHERE " & strKriterium, dbOpenDynaset)

     Select Case rst!FeiertagArtID

         Case 1

             datTemp = CDate(rst!Tag & "." & rst!Monat & "." & intJahr)

         Case 2

             datTemp = Ostersonntag(intJahr) + rst!TageBisStichtag

         Case 3

             datTemp = CDate(VierterAdvent(intJahr)) + rst!TageBisStichtag

     End Select

     FeiertagErmitteln = datTemp

Sie haben das Ende des frei verfügbaren Teil dieses Artikels erreicht!

Wenn Sie mehr lesen und auf viele weitere Artikel zugreifen möchten, melden Sie sich als Abonnent unter Login an. Falls nicht, bestellen Sie doch einfach ein Jahresabonnement!