PDA

Vollständige Version anzeigen : Wie ermittle ich die Feiertage eines Jahres?


Stefan Kulpa
01.02.2003, 06:29
<div><link href="http://www.ms-office-forum.de/ubb/codeconv.css" rel="stylesheet"><pre><span class="TOKEN">Option</span> <span class="TOKEN">Explicit</span>
<span class="REM">'// ----------------------------------------------------------------</span>
<span class="REM">'// Feiertagsberechnung nach dem Algorithmus von Carl Friedrich Gau&szlig;</span>
<span class="REM">'// ----------------------------------------------------------------</span>
<span class="TOKEN">Type</span> DtFeiertage
Jahreszahl <span class="TOKEN">As</span> <span class="TOKEN">Long</span>
Ostern <span class="TOKEN">As</span> Date
Neujahr <span class="TOKEN">As</span> Date
DreiKoenige <span class="TOKEN">As</span> Date
Rosenmontag <span class="TOKEN">As</span> Date
Aschermittwoch <span class="TOKEN">As</span> Date
Karfreitag <span class="TOKEN">As</span> Date
Ostersonntag <span class="TOKEN">As</span> Date
Ostermontag <span class="TOKEN">As</span> Date
Maifeiertag <span class="TOKEN">As</span> Date
ChrHimmelfahrt <span class="TOKEN">As</span> Date
Pfingstsonntag <span class="TOKEN">As</span> Date
Pfingstmontag <span class="TOKEN">As</span> Date
Fronleichnam <span class="TOKEN">As</span> Date
MariaeHimmelfahrt <span class="TOKEN">As</span> Date
DtEinheit <span class="TOKEN">As</span> Date
Reformationstag <span class="TOKEN">As</span> Date
Allerheiligen <span class="TOKEN">As</span> Date
Heiligabend <span class="TOKEN">As</span> Date
Weihnachten1 <span class="TOKEN">As</span> Date
Weihnachten2 <span class="TOKEN">As</span> Date
Sylvester <span class="TOKEN">As</span> Date
<span class="TOKEN">End</span> <span class="TOKEN">Type</span>
&nbsp;
<span class="TOKEN">Dim</span> m_uDTF <span class="TOKEN">As</span> DtFeiertage
&nbsp;
<span class="TOKEN">Sub</span> Beispiel()
&nbsp;
<span class="TOKEN">Call</span> BerechneFeiertage(Year(Now))
<span class="TOKEN">Debug.Print</span> &quot;Die Feiertage f&uuml;r &quot;; Year(Now); vbCrLf
<span class="TOKEN">Debug.Print</span> &quot;Neujahr &quot;; Format(m_uDTF.Neujahr, &quot;Long Date&quot;)
<span class="TOKEN">Debug.Print</span> &quot;Hl. Drei K&ouml;nige &quot;; Format(m_uDTF.DreiKoenige, &quot;Long Date&quot;)
<span class="TOKEN">Debug.Print</span> &quot;Rosenmontag &quot;; Format(m_uDTF.Rosenmontag, &quot;Long Date&quot;)
<span class="TOKEN">Debug.Print</span> &quot;Aschermittwoch &quot;; Format(m_uDTF.Aschermittwoch, &quot;Long Date&quot;)
<span class="TOKEN">Debug.Print</span> &quot;Karfreitag &quot;; Format(m_uDTF.Karfreitag, &quot;Long Date&quot;)
<span class="TOKEN">Debug.Print</span> &quot;Ostersonntag &quot;; Format(m_uDTF.Ostersonntag, &quot;Long Date&quot;)
<span class="TOKEN">Debug.Print</span> &quot;Ostermontag &quot;; Format(m_uDTF.Ostermontag, &quot;Long Date&quot;)
<span class="TOKEN">Debug.Print</span> &quot;Maifeiertag &quot;; Format(m_uDTF.Maifeiertag, &quot;Long Date&quot;)
<span class="TOKEN">Debug.Print</span> &quot;Christi Himmelfahrt &quot;; Format(m_uDTF.ChrHimmelfahrt, &quot;Long Date&quot;)
<span class="TOKEN">Debug.Print</span> &quot;Pfingstsonntag &quot;; Format(m_uDTF.Pfingstsonntag, &quot;Long Date&quot;)
<span class="TOKEN">Debug.Print</span> &quot;Pfingstmontag &quot;; Format(m_uDTF.Pfingstmontag, &quot;Long Date&quot;)
<span class="TOKEN">Debug.Print</span> &quot;Fronleichnam &quot;; Format(m_uDTF.Fronleichnam, &quot;Long Date&quot;)
<span class="TOKEN">Debug.Print</span> &quot;Mari&auml; Himmelfahrt &quot;; Format(m_uDTF.MariaeHimmelfahrt, &quot;Long Date&quot;)
<span class="TOKEN">Debug.Print</span> &quot;Tag der dt. Einheit &quot;; Format(m_uDTF.DtEinheit, &quot;Long Date&quot;)
<span class="TOKEN">Debug.Print</span> &quot;Reformationstag &quot;; Format(m_uDTF.Reformationstag, &quot;Long Date&quot;)
<span class="TOKEN">Debug.Print</span> &quot;Allerheiligen &quot;; Format(m_uDTF.Allerheiligen, &quot;Long Date&quot;)
<span class="TOKEN">Debug.Print</span> &quot;Heiligabend &quot;; Format(m_uDTF.Heiligabend, &quot;Long Date&quot;)
<span class="TOKEN">Debug.Print</span> &quot;Weihnachten1 &quot;; Format(m_uDTF.Weihnachten1, &quot;Long Date&quot;)
<span class="TOKEN">Debug.Print</span> &quot;Weihnachten2 &quot;; Format(m_uDTF.Weihnachten2, &quot;Long Date&quot;)
<span class="TOKEN">Debug.Print</span> &quot;Sylvester &quot;; Format(m_uDTF.Sylvester, &quot;Long Date&quot;)
<span class="REM">'// ----------------------------------------------------------------</span>
<span class="REM">'// Ausgabe:</span>
<span class="REM">'// ----------------------------------------------------------------</span>
<span class="REM">'// Neujahr Mittwoch, 1. Januar 2003</span>
<span class="REM">'// Hl. Drei K&ouml;nige Montag, 6. Januar 2003</span>
<span class="REM">'// Rosenmontag Montag, 3. M&auml;rz 2003</span>
<span class="REM">'// Aschermittwoch Mittwoch, 5. M&auml;rz 2003</span>
<span class="REM">'// Karfreitag Freitag, 18. April 2003</span>
<span class="REM">'// Ostersonntag Sonntag, 20. April 2003</span>
<span class="REM">'// Ostermontag Montag, 21. April 2003</span>
<span class="REM">'// Maifeiertag Donnerstag, 1. Mai 2003</span>
<span class="REM">'// Christi Himmelfahrt Donnerstag, 29. Mai 2003</span>
<span class="REM">'// Pfingstsonntag Sonntag, 8. Juni 2003</span>
<span class="REM">'// Pfingstmontag Montag, 9. Juni 2003</span>
<span class="REM">'// Fronleichnam Donnerstag, 19. Juni 2003</span>
<span class="REM">'// Mari&auml; Himmelfahrt Freitag, 15. August 2003</span>
<span class="REM">'// Tag der dt. Einheit Freitag, 3. Oktober 2003</span>
<span class="REM">'// Reformationstag Freitag, 31. Oktober 2003</span>
<span class="REM">'// Allerheiligen Samstag, 1. November 2003</span>
<span class="REM">'// Heiligabend Mittwoch, 24. Dezember 2003</span>
<span class="REM">'// Weihnachten1 Donnerstag, 25. Dezember 2003</span>
<span class="REM">'// Weihnachten2 Freitag, 26. Dezember 2003</span>
<span class="REM">'// Sylvester Mittwoch, 31. Dezember 2003</span>
<span class="REM">'// ----------------------------------------------------------------</span>
<span class="TOKEN">End</span> <span class="TOKEN">Sub</span>
&nbsp;
<span class="TOKEN">Sub</span> BerechneFeiertage(Jahreszahl <span class="TOKEN">As</span> <span class="TOKEN">Integer</span>)
&nbsp;
<span class="REM">'// Als Refrenzdatum zun&auml;chst m_uDTF.Ostern berechnen</span>
<span class="TOKEN">If</span> <span class="TOKEN">Not</span> Ostern_berechnen(Jahreszahl) <span class="TOKEN">Then</span> <span class="TOKEN">Exit Sub</span>
&nbsp;
<span class="REM">'// Neujahr setzen (fester Feiertag am 1. Januar)</span>
m_uDTF.Neujahr = DateSerial(Jahreszahl, 1, 1)
&nbsp;
<span class="REM">'// Hl. Drei K&ouml;nige setzen (fester Feiertag am 6. Januar)</span>
m_uDTF.DreiKoenige = DateSerial(Jahreszahl, 1, 6)
&nbsp;
<span class="REM">'// Rosenmontag berechnen (beweglicher Feiertag; 48 Tage vor Ostern)</span>
m_uDTF.Rosenmontag = m_uDTF.Ostern - 48
&nbsp;
<span class="REM">'// Aschemittwoch berechnen (beweglicher Feiertag; 46 Tage vor Ostern)</span>
m_uDTF.Aschermittwoch = m_uDTF.Ostern - 46
&nbsp;
<span class="REM">'// Karfreitag berechnen (beweglicher Feiertag; 2 Tage vor Ostern)</span>
m_uDTF.Karfreitag = m_uDTF.Ostern - 2
&nbsp;
<span class="REM">'// Ostersonntag = m_uDTF.Ostern!</span>
m_uDTF.Ostersonntag = m_uDTF.Ostern
&nbsp;
<span class="REM">'// Ostermontag berechnen (beweglicher Feiertag; 1 Tag nach Ostern)</span>
m_uDTF.Ostermontag = m_uDTF.Ostern + 1
&nbsp;
<span class="REM">'// Maifeiertag setzen (fester Feiertag am 1. Mai)</span>
m_uDTF.Maifeiertag = DateSerial(Jahreszahl, 5, 1)
&nbsp;
<span class="REM">'// Christi Himmelfahrt berechnen (beweglicher Feiertag; 39 Tage nach Ostern)</span>
m_uDTF.ChrHimmelfahrt = m_uDTF.Ostern + 39
&nbsp;
<span class="REM">'// Pfingstsonntag berechnen (beweglicher Feiertag; 49 Tage nach Ostern)</span>
m_uDTF.Pfingstsonntag = m_uDTF.Ostern + 49
&nbsp;
<span class="REM">'// Pfingstmontag berechnen (beweglicher Feiertag; 50 Tage nach Ostern)</span>
m_uDTF.Pfingstmontag = m_uDTF.Ostern + 50
&nbsp;
<span class="REM">'// Fronleichnam berechnen (beweglicher Feiertag; 60 Tage nach Ostern)</span>
m_uDTF.Fronleichnam = m_uDTF.Ostern + 60
&nbsp;
<span class="REM">'// Mari&auml; Himmelfahrt setzen (fester Feiertag am 15. August)</span>
m_uDTF.MariaeHimmelfahrt = DateSerial(Jahreszahl, 8, 15)
&nbsp;
<span class="REM">'// Tag der deutschen Einheit setzen (fester Feiertag am 3. Oktober)</span>
m_uDTF.DtEinheit = DateSerial(Jahreszahl, 10, 3)
&nbsp;
<span class="REM">'// Reformationstag setzen (fester Feiertag am 31. Oktober)</span>
m_uDTF.Reformationstag = DateSerial(Jahreszahl, 10, 31)
&nbsp;
<span class="REM">'// Allerheiligen setzen (fester Feiertag am 1. November)</span>
m_uDTF.Allerheiligen = DateSerial(Jahreszahl, 11, 1)
&nbsp;
<span class="REM">'// Heiligabend setzen (fester 'Feiertag' am 24. Dezember)</span>
m_uDTF.Heiligabend = DateSerial(Jahreszahl, 12, 24)
&nbsp;
<span class="REM">'// Erster Weihnachtstag setzen (fester 'Feiertag' am 25. Dezember)</span>
m_uDTF.Weihnachten1 = DateSerial(Jahreszahl, 12, 25)
&nbsp;
<span class="REM">'// Zweiter Weihnachtstag setzen (fester 'Feiertag' am 26. Dezember)</span>
m_uDTF.Weihnachten2 = DateSerial(Jahreszahl, 12, 26)
&nbsp;
<span class="REM">'// Sylvester setzen (fester 'Feiertag' am 31. Dezember)</span>
m_uDTF.Sylvester = DateSerial(Jahreszahl, 12, 31)
&nbsp;
<span class="TOKEN">End</span> <span class="TOKEN">Sub</span>
&nbsp;
<span class="TOKEN">Function</span> Ostern_berechnen(<span class="TOKEN">ByVal</span> lYear <span class="TOKEN">As</span> <span class="TOKEN">Long</span>) <span class="TOKEN">As</span> <span class="TOKEN">Boolean</span>
&nbsp;
<span class="REM">'// Berechnung mit Hilfe des Algorithmus von Gau&szlig;</span>
<span class="TOKEN">On Error GoTo</span> Err_Ostern_berechnen
&nbsp;
<span class="TOKEN">Dim</span> i1 <span class="TOKEN">As</span> <span class="TOKEN">Integer</span>
<span class="TOKEN">Dim</span> i2 <span class="TOKEN">As</span> <span class="TOKEN">Integer</span>
<span class="TOKEN">Dim</span> i3 <span class="TOKEN">As</span> <span class="TOKEN">Integer</span>
<span class="TOKEN">Dim</span> i4 <span class="TOKEN">As</span> <span class="TOKEN">Integer</span>
<span class="TOKEN">Dim</span> i5 <span class="TOKEN">As</span> <span class="TOKEN">Integer</span>
<span class="TOKEN">Dim</span> iTZ <span class="TOKEN">As</span> <span class="TOKEN">Integer</span> <span class="REM">'// iTZ = Tageszahl</span>
&nbsp;
i1 = lYear Mod 19 <span class="REM">'// Formel nach Gau&szlig;</span>
i2 = lYear Mod 4 <span class="REM">'// Werte f&uuml;r die Jahre</span>
i3 = lYear Mod 7 <span class="REM">'// 1900 - 2099</span>
&nbsp;
i4 = (19 * i1 + 24) Mod 30
i5 = (2 * i2 + 4 * i3 + 6 * i4 + 5) Mod 7
iTZ = 22 + i4 + i5 <span class="REM">'// Ermittelt den Tag</span>
<span class="TOKEN">If</span> iTZ &gt; 31 <span class="TOKEN">Then</span> <span class="REM">'// M&auml;rz oder April</span>
iTZ = iTZ - 31 <span class="REM">'// Wenn April, dann - 31 Tage</span>
<span class="TOKEN">If</span> iTZ = 26 <span class="TOKEN">Then</span> iTZ = 19 <span class="REM">'// Wenn 26.4. dann 19.4.</span>
<span class="TOKEN">If</span> (iTZ = 25 <span class="TOKEN">And</span> i4 = 28 <span class="TOKEN">And</span> i1 &gt; 10) <span class="TOKEN">Then</span> iTZ = 18
m_uDTF.Ostern = DateSerial(lYear, 4, iTZ) <span class="REM">'// Ostern im April</span>
<span class="TOKEN">Else</span>
m_uDTF.Ostern = DateSerial(lYear, 3, iTZ) <span class="REM">'// Ostern im Maerz</span>
<span class="TOKEN">End</span> <span class="TOKEN">If</span>
Ostern_berechnen = <span class="TOKEN">True</span>
&nbsp;
Exit_Ostern_berechnen:
<span class="TOKEN">Exit Function</span>
&nbsp;
Err_Ostern_berechnen:
Ostern_berechnen = <span class="TOKEN">False</span>
GoTo Exit_Ostern_berechnen
&nbsp;
<span class="TOKEN">End</span> <span class="TOKEN">Function</span></pre></div>
Code eingefügt mit dem MOF Code Converter (http://www.ms-office-forum.net/forum/codeconverter.php)

BlaXioN
07.01.2004, 09:46
Hehe die Funktion könnt ich bei mir auch noch als gimick einbaun.

danke dafür :biggrinl:

Johnny Loser
01.08.2004, 22:58
.... mag es wichtig sein, auf welchen Tag der Buß- und Bettag fällt.

Ergänzend zum o.a. Code:

'In der Deklaration ergänzen
BussBettag As Date

'In der Sub BerechneFeiertage ergänzen
'// Buss- und Bettag setzen (beweglicher 'Feiertag' Mittwoch vor dem letzten Sonntag im Kirchenjahr)
m_uDTF.BussBettag = BussBettag_Errechnen(Jahreszahl)

'Funktion zur Berechnung von Buß- und Bettag
Function BussBettag_Errechnen(ByVal lYear As Long) As Date
Dim wDay As Integer
wDay = WeekDay(CDate("24.12." & lYear))
BussBettag_Errechnen = DateAdd("d", -(31 + wDay), CDate("24.12." & lYear))
End Function

Taita
16.10.2009, 20:30
Guten Tag
Herzlichen Dank für den Beitrag "Feiertage berechnen" !!!
Mit wenigen redaktionellen Änderungen lässt sich der Code auch für südamerikanische Länder verwenden,

Predator21
09.11.2010, 11:14
Hallo zusammen,

wie kann ich den Feiertag und das entsprechende Datum in einer Tabelle abspeichern ? So wie es im Direktbereich ausgegeben wird...

- siehe Anhang

Danke schonmal