Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1772to1776
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

VBA Termine mit Feiertagsverschiebung

VBA Termine mit Feiertagsverschiebung
20.07.2020 13:19:54
Bernd
Hallo miteinander,
mein 1. Beitrag nachdem ich schon seit Jahren mein Wissen mit Hilfe des Forums erweitere . . .
Hier komme ich mit meinen bescheidenen Excel-Kenntnissen nicht weiter:
Es geht um Termine in verschiedenen Intervallen (1-/2-/4-wöchentlich) während eines bestimmten Zeitraumes. Die Intervalle wiederholen sich nach längstens 4 Wochen (daher die „Wochenkennzahl“). Die Termine sind grundsätzlich Mo – Fr, jedoch nicht an einem Feiertag. Dann verschiebt sich der Termin nach hinten, es muss dann auch ein Samstag (sofern kein Feiertag) benutzt werden. Sind z.B. in einer Woche 2 Feiertage, dann verschiebt sich ein Termin auf die Folgewoche. Eine Formel zur Ermittlung der Feiertage habe ich gefunden, das klappt auch. Ich hoffe alles liest sich noch einigermaßen verständlich.
Im Anhang eine Beispieldatei. Der untere Teil spiegelt die Bestandsdaten, jetzt sollen per Makro die Verschiebungen durch die genannten Feiertage eingearbeitet werden. Ist der Ansatz so überhaupt richtig? Oder ist es besser/einfacher dass Excel die Kalender mit den gewünschten Bedingungen selbst erstellt? Daher die 3 Felder mit Start, Ende und Wochenkennzahl Start.
Über Anregungen wäre ich sehr dankbar. Bedenkt aber bitte dass in vba nur Einsteigerkenntnisse vorhanden sind. :)
Schon mal vielen Dank und Grüße
Bernd
https://www.herber.de/bbs/user/139179.xlsx

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA Termine mit Feiertagsverschiebung
20.07.2020 17:01:21
Sigi
Hallo Bernd,
die Bedingung "Sind z.B. in einer Woche 2 Feiertage, dann verschiebt sich ein Termin auf die Folgewoche." ist unverständlich. Was ist bei dir eine Woche? Mo-So wie die DIN-KW? Oder So-Sa wie in den USA?
Angenommen du hast mittwochs wöchentliche Termine: dann wäre ja Karfreitag und Ostersonntag in einer Woche (DIN) oder aber Ostersonntag und - montag (US). Warum sollte da der Mittwoch-Termin in die nächste Woche fallen?
Sigi
AW: VBA Termine mit Feiertagsverschiebung
21.07.2020 06:20:20
Bernd
Hallo Sigi,
"Woche" meint hier Mo-So. Bei deinem Karfreitag-Beispiel würden sich Mo-Do nicht verschieben, der Freitag aber auf den Samstag. "2 Feiertage in 1 Woche" bezieht sich nur auf die Arbeitstage. Wenn Feiertag = Sonntag, passiert nichts. Wenn 1. und 2. Weihnachtsfeiertag auf Fr & Sa fallen, wird der Freitagstermin auf den darauffolgenden Montag verschoben (Samstag geht ja nicht wegen Feiertag), die anderen Termine dieser Folgewoche (Mo-Fr) je um einen Tag nach vorn.
Kam das jetzt einigermaßen verständlich rüber?
Grüße
Bernd
Anzeige
AW: VBA Termine mit Feiertagsverschiebung
21.07.2020 10:04:40
Sigi
Hallo Bernd,
also Verschiebung auf nächsten ArbTag (optional auch auf SA). Soweit klar.
Wie sieht's mit den Feiertagen aus. Ich denke an eine VBA-Fkt., da gehören die Feiertage gleich integriert. Welche Feiertage (Region, Kanton, Bundesland) kommen da in Frage?
Sigi
AW: VBA Termine mit Feiertagsverschiebung
21.07.2020 15:57:30
Sigi
Hallo Bernd,
anbei VBA-Fkt. (s. Mappe)
Du musst folgende Parameter eingeben:
- Wochentag (1-5 = Mo-Fr)
- N_wöchentlich (alle wieviele Wochen?, max. 53)
- BLand (2-stellig, ggf, ergänzt um E (ev.) od. K (kath)
- StartDatum (sollte bereits ein korrektes Datum gem. Zyklus sein!)
- SA_AusweichTermin (optional auch SA als Ausweichtermin)
Enddatum: soweit du die Formel halt ziehst
Sigi
https://www.herber.de/bbs/user/139201.xlsm
Anzeige
AW: VBA Termine mit Feiertagsverschiebung
22.07.2020 09:49:02
Bernd
Vielen Dank Sigi! Das ist viel mehr als ich in Wochen mühsam erlesen könnte!
Aber:
wie so oft habe ich die Bedingungen wohl nicht deutlich genug formuliert. Deine Funktion geht davon
aus, dass nur der Feiertagstermin verschoben werden soll. Wenn aber der Feiertagstermin einen Tag
nach vorn rückt, soll der ursprüngliche Termin dieses Tages auch 1 Tag nach vorn usw.
Bsp. 1
Montag ist Feiertag, dann verschiebt sich Montag auf Dienstag, Dienstag auf Mittwoch, Mittwoch auf
Donnerstag, Donnerstag auf Freitag und Freitag auf Samstag. Dann ist alles wieder im Lot.
Bsp. 2
Freitag ist Feiertag, dann verschiebt sich Freitag auf Samstag. Fertig.
Bsp. 3
Montag und Samstag derselben Woche sind Feiertage. Dann geht es wie in Bsp. 1, aber statt "Freitag
auf Samstag" muss dann "Freitag auf Montag" verschoben werden.
Bsp. 4
Montag und Dienstag derselben Woche und Montag der Folgewoche sind Feiertage. Dann
verschiebt sich zunächst alles um 2 Tage bis am Samstag der Folgewoche 1 Tag "aufgeholt" wird. Ab
diesem Termin beträgt die Verschiebung nur noch 1 Tag. Das geht dann wieder bis Samstag, dann ist die Verschiebung beendet.
Im Anhang habe ich in deiner Mappe die "Paarungen" markiert, die es zu verhindern gilt. innerhalb
desselben "n-wöchentlich"-Wertes darf es keine übereinstimmenden Daten geben.
Es wäre prima, wenn sich das realisieren lässt. :)
Viele Grüße und nochmals herzlichen Dank.
Bernd
https://www.herber.de/bbs/user/139212.xlsm
Anzeige
AW: VBA Termine mit Feiertagsverschiebung
22.07.2020 15:25:16
Sigi
Hallo Bernd,
das ist dann doch was anderes.
Diese Info gleich im 1. Post hätte Missverständnisse vermieden und ich hätte nicht drei Std. in die falsche Richtung entwickelt.
Ich lasse deine Frage mal auf "offen". Evtl. hat sonst jemand eine Idee.
Sigi
AW: VBA Termine mit Feiertagsverschiebung
21.07.2020 15:13:25
matze
Hallo Bernd,
was Du suchst scheint mir wie der Tourenplan unseres Abfallentsorgers auszusehen ;).
https://www.kaev.de/Templates/Content/DetailTourenplanWebsite/PDF/Jahreskalender.aspx?Ort=Calau&OrtId=10,24,0,0
Aber mal Spaß beiseite:
hier mal der Code für eine Feiertagsfunktion als Macro in ein Modul und Abfrage in Excel in irgendeine Zelle mit =Feiertag(datum)

Public Function Feiertag(Datum As Date) As String
On Error Resume Next
Dim jahr As Integer                    'Jahr
Dim z As Integer                       'Zähler für Anzahl Feiertage
Dim y As Date                          'Ostersonntag
Dim arrDatum(1 To 60)  As Date         'Datumsfeld der Feiertage
Dim arrText(1 To 60) As String         'Feld der Feiertagsbezeichnungen
Dim Besonde(1 To 60) As String         'Feld der Besonderheiten
'Abkürzungen für Bundesland
'BW=Baden-Württemberg         NI=Niedersachsen
'BY=Bayern                    NW=Nordrhein -Westfalen
'BE=Berlin                    RP=Rheinland -Pfalz
'BB=Brandenburg               SL=Saarland
'HB=Bremen                    SN=Sachsen
'HH=Hamburg                   ST=Sachsen -Anhalt
'HE=Hessen                    SH=Schleswig -Holstein
'MV=Mecklenburg -Vorpommern   TH=Thüringen
'Feiertage                    BW BY BE BB HB HH HE MV NI NW RP SL SN ST SH TH
'Neujahrstag (01.01.)          x  x  x  x  x  x  x  x  x  x  x  x  x  x  x  x
'Hl. Drei Könige (06.01.)      x  x                                   x
'Intern. Frauentag (08.03.)          x
'Karfreitag                    x  x  x  x  x  x  x  x  x  x  x  x  x  x  x  x
'Ostermontag                   x  x  x  x  x  x  x  x  x  x  x  x  x  x  x  x
'Tag der Arbeit (01.05.)       x  x  x  x  x  x  x  x  x  x  x  x  x  x  x  x
'Christi Himmelfahrt           x  x  x  x  x  x  x  x  x  x  x  x  x  x  x  x
'Pfingstmontag                 x  x  x  x  x  x  x  x  x  x  x  x  x  x  x  x
'Fronleichnam                  x  x              x        x  x  x  1        1
'Friedensfest (08.08. nur Stadtkreis Augsburg)
'Mariä Himmelfahrt (15.08.)       k                             x
'Tag der dt. Einheit (03.10.)  x  x  x  x  x  x  x  x  x  x  x  x  x  x  x  x
'Weltkindertag (20.09.)                                                     x
'Reformationstag (31.10.)               x           x              x  x     x
'Allerheiligen (01.11.)        x  x                       x  x  x
'Buß- u. Bettag                                                    x
'1.Weihnachtstag (25.12.)      x  x  x  x  x  x  x  x  x  x  x  x  x  x  x  x
'2. Weihnachtstag (26.12)      x  x  x  x  x  x  x  x  x  x  x  x  x  x  x  x
'x  bedeutet gesetzlicher Feiertag
'k  bedeutet gesetzlicher Feiertag in Gemeinden mit überwiegend katholischer _
Bevölkerung
'1  Sonderregelungen in SN und TH
'   Weltkindertag: nur Thüringen 20.9.
'aktuelles Jahr ermitteln
jahr = VBA.Year(Datum)
y = Ostern(jahr)
'Beginn der Feiertagsabfrage
'bewegliche Feiertage
z = 0
z = z + 1:  arrDatum(z) = y - 52:    arrText(z) = "Weiberfastnacht":     Besonde(z) = " (kein  _
_
_
_
Feiertag!)"
z = z + 1:  arrDatum(z) = y - 48:    arrText(z) = "Rosenmontag":         Besonde(z) = " (kein  _
_
_
_
Feiertag!)"
z = z + 1:  arrDatum(z) = y - 47:    arrText(z) = "Faschingsdienstag":   Besonde(z) = " (kein  _
_
_
_
Feiertag!)"
z = z + 1:  arrDatum(z) = y - 46:    arrText(z) = "Aschermittwoch":      Besonde(z) = " (kein  _
_
_
_
Feiertag!)"
z = z + 1:  arrDatum(z) = y - 7:     arrText(z) = "Palmsonntag":         Besonde(z) = " (kein  _
_
_
_
Feiertag!)"
z = z + 1:  arrDatum(z) = y - 3:     arrText(z) = "Gründonnerstag":      Besonde(z) = " (kein  _
_
_
_
Feiertag!)"
z = z + 1:  arrDatum(z) = y - 2:     arrText(z) = "Karfreitag":          Besonde(z) = " ( _
bundesweit)"
z = z + 1:  arrDatum(z) = y:         arrText(z) = "Ostersonntag":        Besonde(z) = " ( _
bundesweit: aber nur in Bbg. auch Feiertag)"
z = z + 1:  arrDatum(z) = y + 1:     arrText(z) = "Ostermontag":         Besonde(z) = " ( _
bundesweit)"
z = z + 1:  arrDatum(z) = y + 39:    arrText(z) = "Christi Himmelfahrt": Besonde(z) = " ( _
bundesweit)"
z = z + 1:  arrDatum(z) = y + 49:    arrText(z) = "Pfingstsonntag":      Besonde(z) = " ( _
bundesweit: aber nur in Bbg. auch Feiertag)"
z = z + 1:  arrDatum(z) = y + 50:    arrText(z) = "Pfingstmontag":       Besonde(z) = " ( _
bundesweit)"
z = z + 1:  arrDatum(z) = y + 60:    arrText(z) = "Fronleichnam":        Besonde(z) = " (nur   _
_
_
_
Bay.,Ba-Wü.,Hessen,)"
z = z + 1:  arrDatum(z) = Erntetag(jahr):    arrText(z) = "Erntedankfest":  Besonde(z) = " (   _
_
_
_
kein Feiertag! = 1.Sonntag im Oktober)"
z = z + 1:  arrDatum(z) = Muttertag(jahr):   arrText(z) = "Muttertag":      Besonde(z) = " (   _
_
_
_
kein Feiertag! = 2.Sonntag im Mai)"
z = z + 1:  arrDatum(z) = Advent(jahr):      arrText(z) = "4.Advent":       Besonde(z) = " (   _
_
_
_
kein Feiertag! = letzter Sonntag vor 25.12.)"
z = z + 1:  arrDatum(z) = Advent(jahr) - 7:  arrText(z) = "3.Advent":       Besonde(z) = " (   _
_
_
_
kein Feiertag!)"
z = z + 1:  arrDatum(z) = Advent(jahr) - 14: arrText(z) = "2.Advent":       Besonde(z) = " (   _
_
_
_
kein Feiertag!)"
z = z + 1:  arrDatum(z) = Advent(jahr) - 21: arrText(z) = "1.Advent":       Besonde(z) = " (   _
_
_
_
kein Feiertag!)"
z = z + 1:  arrDatum(z) = Advent(jahr) - 28:  arrText(z) = "Totensonntag":  Besonde(z) = " ( _
_
_
_
kein Feiertag!)"
z = z + 1:  arrDatum(z) = Advent(jahr) - 32:  arrText(z) = "Buß- und Bettag": Besonde(z) = " ( _
_
_
_
Feiertag nur in Sachsen)"
z = z + 1:  arrDatum(z) = Advent(jahr) - 35:  arrText(z) = "Volkstrauertag":  Besonde(z) = " ( _
_
_
_
kein Feiertag!)"
z = z + 1:  arrDatum(z) = Sommerzeit(jahr)       'Sommerzeit: letzter So im März
arrText(z) = "Beginn Sommerzeit":   Besonde(z) = " (Zeitumstellung 1 Stunde vor)"
z = z + 1:  arrDatum(z) = Sommerzeit(jahr) + 210  'Winterzeit: letzter So im Oktober
arrText(z) = "Ende Sommerzeit":     Besonde(z) = " (Zeitumstellung 1 Stunde zurück)"
'unbewegliche Feiertage
z = z + 1:  arrDatum(z) = DateSerial(jahr, 1, 1)
arrText(z) = "Neujahr":  Besonde(z) = " (bundesweit)"
z = z + 1:  arrDatum(z) = DateSerial(jahr, 1, 6)
arrText(z) = "Hl. Drei Könige":  Besonde(z) = " (nur Bay.,Ba-Wü.,Sa-Anhalt)"
z = z + 1:  arrDatum(z) = DateSerial(jahr, 2, 14)
arrText(z) = "Valentinstag":  Besonde(z) = " (kein Feiertag!)"
z = z + 1:  arrDatum(z) = DateSerial(jahr, 3, 8)
arrText(z) = "Internationaler Frauentag":  Besonde(z) = " (nur Berlin)"
z = z + 1:  arrDatum(z) = DateSerial(jahr, 4, 30)
arrText(z) = " Walpurgisnacht":  Besonde(z) = " (kein Feiertag!)"
z = z + 1:  arrDatum(z) = DateSerial(jahr, 5, 1)
arrText(z) = "Tag der Arbeit":  Besonde(z) = " (bundesweit)"
z = z + 1:  arrDatum(z) = DateSerial(jahr, 5, 8)
arrText(z) = "Tag der Befreiung vom Nationalsozialismus":  Besonde(z) = " (nur Berlin 2020)"
' z = z + 1:  arrDatum(z) = DateSerial(jahr, 6, 1)
' arrText(z) = "Internationaler Kindertag":  Besonde(z) = " (kein Feiertag!)"
z = z + 1:  arrDatum(z) = DateSerial(jahr, 6, 17)
arrText(z) = "Tag der deutschen Einheit (17.Juni 1953)":  Besonde(z) = " (kein Feiertag!)"
z = z + 1:  arrDatum(z) = DateSerial(jahr, 6, 20)
arrText(z) = "Fronleichnam":     Besonde(z) = " (Ba-Wü., Bay., Hessen, NRW, Rheinland-Pfalz,   _
_
_
_
Saarland)"
z = z + 1:  arrDatum(z) = DateSerial(jahr, 8, 8)
arrText(z) = "Friedensfest":         Besonde(z) = " (nur Stadtkreis Augsburg)"
z = z + 1:  arrDatum(z) = DateSerial(jahr, 8, 15)
arrText(z) = "Mariä Himmelfahrt":        Besonde(z) = " (Saarland, Bay. mit überwiegend kath.  _
_
_
_
Bevölkerung)"
z = z + 1:  arrDatum(z) = DateSerial(jahr, 9, 20)
arrText(z) = "Weltkindertag":        Besonde(z) = " (nur Thür.)"
z = z + 1:  arrDatum(z) = DateSerial(jahr, 10, 3)
arrText(z) = "Tag der Deutschen Einheit":        Besonde(z) = " (bundesweit)"
z = z + 1:  arrDatum(z) = DateSerial(jahr, 10, 31)
arrText(z) = "Reformationstag"
Besonde(z) = " (Bbg Bremen Hamburg Mecklenburg-Vorpommern Niedersachsen Sachsen Sachsen- _
Anhalt Schleswig-Holstein Thüringen)"
z = z + 1:  arrDatum(z) = DateSerial(jahr, 11, 1)
arrText(z) = "Allerheiligen":        Besonde(z) = " (BaWü Bay. NW RPf SL)"
z = z + 1:  arrDatum(z) = DateSerial(jahr, 12, 24)
arrText(z) = "Heiligabend":          Besonde(z) = " (kein Feiertag!)"
z = z + 1:  arrDatum(z) = DateSerial(jahr, 12, 25)
arrText(z) = "1. Weihnachtsfeiertag":        Besonde(z) = " (bundesweit)"
z = z + 1:  arrDatum(z) = DateSerial(jahr, 12, 26)
arrText(z) = "2. Weihnachtsfeiertag":        Besonde(z) = " (bundesweit)"
z = z + 1:  arrDatum(z) = DateSerial(jahr, 12, 31)
arrText(z) = "Silvester":        Besonde(z) = " (kein Feiertag!)"
z = z + 1:  arrDatum(z) = DateSerial(jahr, 6, 27)
arrText(z) = "Siebenschläfer":       Besonde(z) = " "
z = z + 1:  arrDatum(z) = DateSerial(jahr, 3, 20)
arrText(z) = "Frühlingsanfang":          Besonde(z) = " "
z = z + 1:  arrDatum(z) = DateSerial(jahr, 6, 21)
arrText(z) = "Sommeranfang":         Besonde(z) = " "
z = z + 1:  arrDatum(z) = DateSerial(jahr, 9, 22)
arrText(z) = "Herbstanfang":         Besonde(z) = " "
z = z + 1:  arrDatum(z) = DateSerial(jahr, 12, 21)
arrText(z) = "Winteranfang":         Besonde(z) = " "
z = z + 1:  arrDatum(z) = DateSerial(jahr, 12, 6)
arrText(z) = "Nikolaustag":          Besonde(z) = " "
z = z + 1:  arrDatum(z) = DateSerial(jahr, 11, 2)
arrText(z) = "Allerseelen":          Besonde(z) = " "
z = z + 1:  arrDatum(z) = DateSerial(jahr, 11, 11)
arrText(z) = "Martinstag":       Besonde(z) = " "
For z = LBound(arrDatum) To z
If Datum = arrDatum(z) Then
Feiertag = arrText(z) & Besonde(z)
End If
Next
End Function        'Feiertag
Function Ostern(jahr As Integer) As Date
'Ostersonntag nach Gauß'scher Osterformel berechnen
Dim x As Integer
x = (((255 - 11 * (jahr Mod 19)) - 21) Mod 30) + 21
Ostern = DateSerial(jahr, 3, 1) + x + (x > 48) + 6 - ((jahr + jahr \ 4 + x + (x > 48) + 1)  _
_
_
_
Mod 7)
End Function
Function Erntetag(Ernte As Integer) As Date
'Erntedankfest = 1.Sonntag im Oktober
Dim x As Date
x = DateSerial(Ernte, 10, 1)
Do While DatePart("w", x, vbMonday) 
Anschließend noch die Funktion für die korrekte DIN-Kalenderwoche:

Function KW_DIN(Datum)
KW_DIN = DatePart("ww", Datum, vbMonday, vbFirstFourDays)
End Function

Wenn man diese Funktionen über einen Sheet mit Kalender laufen läßt, braucht man die entsprechenden Datumswerte nur noch einfärben.
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige