Zurück zur Homepage

Ostern/Feiertage

Osterformel- und funktion frei nach Schwimmer.

Der erste Frühlingsvollmond findet am 21.3 oder danach statt.
Ostern ist der erste Sonntag nach diesem Vollmond und muss
zwischen dem 22. März und dem 25. April (einschließlich) liegen.
Ein synodischer Monat dauert 29,5306 Tage und 225 synodische Monate
sind 6939,688 Tage lang. Etwa genau so lang dauern 19 tropische
Jahre (6939,602 Tage). Das bedeutet, dass sich die Vollmondtage
im 19 Jahre-Zyklus wiederholen.

Mit (J Mod 19) findet man das Jahr im metonischen Zyklus.
Im ersten Jahr ist der Vollmond am 14.4, in den Folgejahren
ist der Vollmond jeweils 11 Tage vorher.
Wenn der Termin dann vor dem 21. März liegt, werden 30 Tage
hinzugezählt.

Den Offset zum 21. März, liefert ((204 - 11 * (J Mod 19)) Mod 30).
Nun ist man aber noch nicht exakt beim Ostersonntag, man
rechnet ja schließlich nicht mit glatten Zahlen und 225
synodische Monate sind eben nicht genau 19 tropische Jahre.

Das Ergebnis wird durch 7 geteilt, 0,9 hinzugezählt,
die Nachkommastellen abgeschnitten und mit 7 multipliziert.
Jetzt wird noch ein Tag hinzugezählt und man ist beim
Ostersonntag.

Die Jahre 1954, 1981, 2049 und 2076 bereiten aber Probleme
und man kommt in diesen Jahren auf den Ostermontag.
Der Term (Abs(Abs(Jahr - 2015) - 47.5) = 13.5) liefert dort
das Ergebnis -1, sonst 0, mit dem man das korrigiert.

Beispieldatei (feiertage.zip 9 kB)

 In C27 das Jahr.

=AUFRUNDEN((("21.3."&C27)+REST(204-11*REST(C27;19);30))/7-(ABS(ABS(C27-2015)-47,5)=13,5);)*7+1

 Public Function Ostern(j As Integer) As Date '1900-2100
  Ostern = CDate(Int((Abs(Abs(j - 2015) - 47.5) = _
    13.5) + 0.9 + (DateSerial(j, 3, 21) + _
    ((204 - 11 * (j Mod 19)) Mod 30)) / 7) * 7 + 1)
  'Neujahr = DateSerial(Jahr, 1, 1)
  'Karfreitag = Ostern - 2
  'Ostermontag = Ostern + 1
  'Himmelfahrt = Ostern + 39
  'Pfingstsonntag = Ostern + 49
  'Pfingstmontag = Ostern + 50
  'Maifeiertag = DateSerial(Jahr, 5, 1)
  'Tag_der_Einheit = DateSerial(Jahr, 10, 3)
  'Heiligabend = DateSerial(Jahr, 12, 24)
  'Erster_Weihnachtsfeiertag = DateSerial(Jahr, 12, 25)
  'Zweiter_Weihnachtsfeiertag = DateSerial(Jahr, 12, 26)
  'Sylvester = DateSerial(Jahr, 12, 31)
  'BussUndBettag = DateSerial(Jahr, 11, 22) - WeekDay(DateSerial(Jahr, 11, 25), vbSunday)
End Function

Public Function BussUndBettag(Jahr As Integer)
  ' Buss- und Bettag ist der Mittwoch zwischen 16. und 22. November
  BussUndBettag = DateSerial(Jahr, 11, 22) - WeekDay(DateSerial(Jahr, 11, 25), vbSunday)
End Function

 'Buss und Bettag als Formel

=DATUM(A1;11;22)-WOCHENTAG(DATUM(A1;11;25))