Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1892to1896
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
Kalender in Userform mit Feiertagen
18.08.2022 11:27:58
Tim
Hallo zusammen,
ich habe mir dank des Forums, einen Kalender in einer Userform aufgesetzt, zu denen ich gern noch die Feiertage angezeigt haben möchte, an dessen Herausforderung ich scheitere.
Zur Berechnung der Feiertage habe ich eine Funktion gefunden. Um sie zu verstehen, habe ich sie in die Berechnung der Nettoarbeitstage eingebunden, jedoch erscheint da eine Fehlermeldung.
Noch viel größer ist die Herausforderung, die Feiertage im Kalender anzuzeigen (farbig), wer kann mir dazu weiterhelfen?
Hier die Datei https://www.herber.de/bbs/user/154703.xlsm

Sub Datum_ermitteln()
Dim x As Byte, letzterTag As Byte
a = DateValue("1 " & UserForm1.Monat & " " & UserForm1.Jahr)
letzterTag = Day(DateSerial(Year(a), Month(a) + 1, 0))
Nettoarbeitstage = WorksheetFunction.NetworkDays(a, DateValue(letzterTag & " " & UserForm1.Monat & " " & UserForm1.Jahr), Feiertag)
ersterMontag = a - Day(a) - Weekday(a - Day(a), vbMonday) + 8
If Day(ersterMontag + 1) 

Function Feiertag(Datum As Date) As String
Dim J%, D%
Dim O As Date
J = Year(Datum)
'Osterberechnung
D = (((255 - 11 * (J Mod 19)) - 21) Mod 30) + 21
O = DateSerial(J, 3, 1) + D + (D > 48) + 6 - _
((J + J \ 4 + D + (D > 48) + 1) Mod 7)
'Feiertage berechnen
Select Case Datum
Case DateSerial(J, 1, 1)
Feiertag = "Neujahr"
Case DateSerial(J, 1, 6)
Feiertag = "Dreikönig*"
Case DateAdd("D", -2, O)
Feiertag = "Karfreitag"
Case O
Feiertag = "Ostersonntag"
Case DateAdd("D", 1, O)
Feiertag = "Ostermontag"
Case DateSerial(J, 5, 1)
Feiertag = "Erster Mai"
Case DateAdd("D", 39, O)
Feiertag = "Christi Himmelfahrt"
Case DateAdd("D", 49, O)
Feiertag = "Pfingstsonntag"
Case DateAdd("D", 50, O)
Feiertag = "Pfingstmontag"
Case DateAdd("D", 60, O)
Feiertag = "Fronleichnam*"
Case DateSerial(J, 8, 15)
Feiertag = "Maria Himmelfahrt*"
Case DateSerial(J, 10, 3)
Feiertag = "Deutsche Einheit"
Case DateSerial(J, 11, 22) - (DateSerial(J, 11, 18) Mod 7)
Feiertag = "Buß- und Bettag*"
Case DateSerial(J, 10, 31)
Feiertag = "Reformationstag*"
Case DateSerial(J, 11, 1)
Feiertag = "Allerheiligen*"
Case DateSerial(J, 12, 24)
Feiertag = "Heilig Abend*"
Case DateSerial(J, 12, 25)
Feiertag = "EWeihnacht"
Case DateSerial(J, 12, 26)
Feiertag = "ZWeihnacht"
Case DateSerial(J, 12, 31)
Feiertag = "Silvester*"
Case Else
Feiertag = ""
End Select
End Function

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Kalender in Userform mit Feiertagen
18.08.2022 12:05:00
Rudi
Hallo,

  'Tage befüllen
For x = 1 To 42
UserForm1.Controls("Tag" & x).Caption = Format(Day(erstertag + x), "0#")
If MonthName(Month(erstertag + x)) = UserForm1.Monat Then
UserForm1.Controls("Tag" & x).Enabled = True
Else
UserForm1.Controls("Tag" & x).Enabled = False
End If
UserForm1.Controls("Tag" & x).Font.Bold = Feiertag(erstertag + x)  "" 'Feiertag fett
Next

AW: Kalender in Userform mit Feiertagen
18.08.2022 12:56:38
Tim
Hallo Rudi,
vielen Dank für deine Antwort, ganz scheint es nicht zu funktionieren, da jetzt alle Tage fett markiert sind.
bei mir geht's. owT
18.08.2022 13:05:38
Rudi
AW: bei mir geht's. owT
18.08.2022 13:27:28
Tim
Komisch, bei mir nicht, an was könnte das liegen?
Zudem die Frage, was der Grund sein könnte, das ich hiermit eine Fehlermeldung erhalte?
Nettoarbeitstage = WorksheetFunction.NetworkDays(a, DateValue(letzterTag & " " & UserForm1.Monat & " " & UserForm1.Jahr), Feiertag)
Anzeige
Nettoarbeitstag
18.08.2022 13:54:50
Rudi
FEIERTAGE muss ein Zellbereich oder ein Array der fortlaufenden Zahlen sein.

Function Feiertage(j As Integer)
Dim D%
Dim O As Date
'Osterberechnung
D = (((255 - 11 * (j Mod 19)) - 21) Mod 30) + 21
O = DateSerial(j, 3, 1) + D + (D > 48) + 6 - _
((j + j \ 4 + D + (D > 48) + 1) Mod 7)
'Feiertage in Array
Feiertage = Array(CLng(DateSerial(j, 1, 1)), _
CLng(DateSerial(j, 1, 6)), _
CLng(O - 2), _
CLng(O), _
CLng(O + 1), _
CLng(DateSerial(j, 5, 1)), _
CLng(O + 39), _
CLng(O + 49), _
CLng(O + 50), _
CLng(O + 60), _
CLng(DateSerial(j, 8, 15)), _
CLng(DateSerial(j, 10, 3)), _
CLng((DateSerial(j, 11, 22) - (DateSerial(j, 11, 18) Mod 7))), _
CLng(DateSerial(j, 10, 31)), _
CLng(DateSerial(j, 11, 1)), _
CLng(DateSerial(j, 12, 24)), _
CLng(DateSerial(j, 12, 25)), _
CLng(DateSerial(j, 12, 26)), _
CLng(DateSerial(j, 12, 31)))
End Function

Nettoarbeitstage = WorksheetFunction.NetworkDays(a, DateValue(letzterTag & " " & UserForm1.Monat & " " & UserForm1.Jahr), Feiertage(Userform1.Jahr))
Gruß
Rudi
Anzeige
AW: Kalender in Userform mit Feiertagen
18.08.2022 14:34:21
Alwin
Hallo Tim,
mal noch eine andere Möglichkeit. Die Feiertage werden in einer Stringvariable eingelesen und mittels .Instr überwacht. Das ist mal so 'ne kleine andere Herangehensweise.
https://www.herber.de/bbs/user/154710.xlsm
Gruß Uwe
AW: Kalender in Userform mit Feiertagen
18.08.2022 15:16:44
Alwin
ändere mal so:

Sub Datum_ermitteln()
Dim x As Byte, letzterTag As Byte, a As Date, ersterMontag As Date, erstertag As Date, Nettoarbeitstage As Integer, sumTag$
FeiertageBerechnen
a = DateValue("1 " & UserForm1.Monat & " " & UserForm1.Jahr)
letzterTag = Day(DateSerial(Year(a), Month(a) + 1, 0))
Nettoarbeitstage = WorksheetFunction.NetworkDays(a, DateValue(letzterTag & " " & UserForm1.Monat & " " & UserForm1.Jahr))
ersterMontag = a - Day(a) - Weekday(a - Day(a), vbMonday) + 8
If Day(ersterMontag + 1)  0 Then
UserForm1.Controls("Tag" & x).FontBold = True
Else
UserForm1.Controls("Tag" & x).Enabled = False
UserForm1.Controls("Tag" & x).Enabled = True
UserForm1.Controls("Tag" & x).FontBold = False
End If
If MonthName(Month(erstertag + x)) = UserForm1.Monat Then
UserForm1.Controls("Tag" & x).Enabled = True
Else
UserForm1.Controls("Tag" & x).Enabled = False
End If
Next
'Kalenderwochen befüllen
UserForm1.KW1.Caption = DatePart("ww", erstertag + 1, vbMonday, vbFirstFourDays)
UserForm1.KW2.Caption = DatePart("ww", erstertag + 8, vbMonday, vbFirstFourDays)
UserForm1.KW3.Caption = DatePart("ww", erstertag + 15, vbMonday, vbFirstFourDays)
UserForm1.KW4.Caption = DatePart("ww", erstertag + 22, vbMonday, vbFirstFourDays)
UserForm1.KW5.Caption = DatePart("ww", erstertag + 29, vbMonday, vbFirstFourDays)
UserForm1.KW6.Caption = DatePart("ww", erstertag + 36, vbMonday, vbFirstFourDays)
UserForm1.Nettoarbeitstage.Caption = "Nettoarbeitstage " & Nettoarbeitstage
End Sub
Da war noch ein Darstellungsfehler drin.
Gruß Uwe
Anzeige

304 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige