Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1800to1804
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 Wochenfeiertag

VBA Wochenfeiertag
19.12.2020 19:51:51
Peer
Hallo.
Ich experimentiere schon seit einiger Zeit an einem scheinbar einfachen Code, bekomme aber leider nicht den erhofften Erfolg.
Ich möchte in den TextBoxen txt_ArbZ_Beginn und txt_ArbZ_Ende Werte eintragen, bestimmt, ob der Kalendertag der Spalte 2 der aktiven Zeile ein Feiertag ist.
Also an jeden Wochentag sollen in die Textboxen leer bleiben, wenn der Tag aber ein Wochenfeiertag ist (lbl_Feiertag bekommt einen Wert aus dem Kommentar der aktiven Zelle), dann soll in die TextBoxen 8:00 bzw 15:48 eingetragen werden. Wenn aber der Wochenfeiertag Heiligabend bzw Silvester ist (lbl_Feiertag bekommt die Kommentare "Heiligabend" bzw. "Silvester"), sollen in die TextBoxen die Werte 7:00 bzw 14:00.
Hier mein bisheriger Versuch:

Private Sub opt_Ruhe_Click()
Dim zeile As Long
zeile = ActiveCell.Row
'wenn Wochentag größer Sonntag und Wochentag kleiner Samstag und Kalendertag rot ( _
Wochenfeiertag) dann ...
If Weekday(zeile, 2) > 1 And Weekday(zeile, 2)  1 And Weekday(zeile, 2)  1 And Weekday(zeile, 2) 
Was ist falsch in der If-Anweisung?
Gruß
Peer

15
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA Wochenfeiertag
19.12.2020 20:46:12
Matthias
MOin!
Ich vermute, dass du die Weekday Funktion falsch anwendest.
https://docs.microsoft.com/de-de/office/vba/language/reference/user-interface-help/weekday-function
Wenn ich das richtig sehen, sollte da als 1. Parameter ein DAtum stehen. UNd mit deinem Hinweis auf Spalte 2 vermute ich, dass es so heißen soll.
weekday(cells(zeile,2)
DAmit würdest du weekday auf die Spalte B der aktuellen Zeile anwenden und da sollte ein Datum stehen. Bei wendest du Funktion auf die Zeilennummer an, mit der Option 2 beim 1. Tag der Woche Parameter.
VG
Anzeige
AW: VBA Wochenfeiertag
19.12.2020 23:32:58
Peer
Hallo Matthias.
Vielen Dank für deine schnelle Antwort.
Ich versuche die ganze Zeit zu verstehen, wie du das meinst. Zum Schluss bin ich einfach deinem Vorschlag gefolgt und habe meinen Code ein damit verändert. Aber ich komme trotzdem zu keiner Lösung.
Meine Datei ist sehr groß, weshalb ich sie leider nicht schicken kann. Aber die kleine (sehr) reduzierte Datei lege ich mal bei, um zu sehen, was ich meine.
Mit einem Rechtsklick auf eine Zeile bei Spalte "Kalendertag" kommt man in die UF.
Schlussendlich habe ich wieder meine Version genommen, weil dein Ratschlag das selbe Ergebnis aufwies.
https://www.herber.de/bbs/user/142461.xlsm
LG
Peer
Anzeige
AW: VBA Wochenfeiertag
19.12.2020 23:54:10
ralf_b
na Peer, immer noch an der Monsteraufgabe?
es ist ein Unterschied ob man es so schreibt
Weekday(Cells(zeile, 2), vbMonday) > 1 'hier wir das Datum aus der Zelle im Spalte B geprüft  

oder so
Weekday(zeile, 2) > 1 ' hier nur eine Zeilennumer und kein Datum 

AW: VBA Wochenfeiertag
20.12.2020 12:22:43
Peer
Hallo ralf_b.
Richtig, immer noch am Großprojekt. Immer wieder fallen Unstimmigkeiten auf, die man am Anfang nicht auf der Rechnung hatte, vernachlässigt oder als Laie vergessen hat.
Das Thema Arbeitszeit ist aber auch ein sehr vielfältiges und endlosen Thema.
Vielen Dank für deinen Tipp, der ich dem vom Matthias ähnelt, nur das der Zähltag bestimmt wird (hier Montag). Leider komme ich auch hier zu keinen befriedigen Erfolg. Wenn der Wochentag zwischen Mo und Fr liegt und ein Feiertag ist (lbl_Kalendertag = rote Schrift), dann soll "08:00" und "15:48" eingetragen werden. Klappt aber nicht. Beide TextBoxen bleiben leer.
Dim zeile As Long
zeile = ActiveCell.Row
'wenn Wochentag größer Sonntag und Wochentag kleiner Samstag und Kalendertag rot ( _
Wochenfeiertag) dann ...
If Weekday(Cells(zeile, 2)) > 1 And Weekday(Cells(zeile, 2))  1 And Weekday(Cells(zeile, 2))  1 And Weekday(Cells(zeile, 2)) 
Gruß
Peer
Anzeige
AW: VBA Wochenfeiertag
20.12.2020 13:47:12
Matthias
Moin!
Teste mal noch, ob deine Farbe wirklich vbRed ist. Einfach mit debug.print ins Direktfenster oder als msgbox
lbl_Kalendertag.ForeColor
ausgeben lassen. Komme erst heute Abend zum Anschauen der Datei,
AW: VBA Wochenfeiertag
20.12.2020 17:36:47
Peer
Hallo Matthias.
Es kommt bei

MsgBox lbl_Kalendertag.ForeColor, vbOKOnly, "test farbe"
der Wert 255 raus.
Ich dachte auch erst, dass die beiden Variablen lbl_Kalendertag und lbl_Feiertag keine Werte zurückgeben und es dadurch nicht funktioniert. Dann habe ich lbl_Feiertag durch Cells(zells(zeile, 2).Comment.Text ersetzt, aber auch hier bleiben die TextBoxen leer, obwohl die MsgBox die Werte korrekt wieder gibt.
Dim zeile As Long
zeile = ActiveCell.Row
'wenn Wochentag größer Sonntag und Wochentag kleiner Samstag und Kalendertag rot ( _
Wochenfeiertag) dann ...
If Weekday(Cells(zeile, 2), vbMonday)  1 And Weekday(Cells(zeile, 2))  1 And Weekday(Cells(zeile, 2)) 

Ich bin es dann anders angegangen und habe mit Select Case eine Lösung finden wollen,
Select Case Weekday(Cells(zeile, 2), vbMonday)
Case Is  5
MsgBox Weekday(Cells(zeile, 2)), vbOKOnly, "Wochenende"
Case Is 
, um herauszufinden, ob die Tage überhaupt richtig "erkannt" werden. Aber es will auch hier  _
nicht richtig klappen. Die Werte von lbl_Feiertag werden wahrscheinlich nicht richtig gelesen.
LG Peer

Anzeige
AW: VBA Wochenfeiertag
20.12.2020 20:29:00
Matthias
Moin!
Bitte nicht wundern, kann da bei dem Problem leider nicht helfen. Da war sie wieder die UF Tag. :-( Die bricht aber mein System weiterhin zum Absturz. Nur beim am Code kann ich das jetzt aber schlecht nachvollziehen.
VG
AW: VBA Wochenfeiertag
20.12.2020 14:48:37
ralf_b
Hallo Peer,
allein im initialize werden deine Arbeitzeitbeginn und -ende textboxen mehrmals überschrieben.
Das liegt am Changeevent. Es müßte auseinander gehalten werden ob die Aktion aus dem initialize oder einer manuellen Eingabe kommt.
ich würde das
If Weekday(Cells(zeile, 2)) > 1 And Weekday(Cells(zeile, 2)) 

'montag (1) bis freitag (5)
so machen

If Weekday(Cells(zeile, 2),vbmonday) 

Anzeige
AW: VBA Wochenfeiertag
20.12.2020 16:19:34
Peer
Hallo ralf_b.
Das hatte ich auch schon versucht, aber es will einfach nicht klappen. Beide Textboxen bleiben leer.
Ich habe Matthias Vorschlag mit der MsgBox

MsgBox lbl_Kalendertag.ForeColor, vbOKOnly, "test farbe"
eingebaut und der Wert von vbRed wird mit 255 angezeigt. Also wird der Wert doch richtig zurückgegeben.
Immer noch keine Ahnung, was ich falsch denke?
LG
Peer
AW: VBA Wochenfeiertag
20.12.2020 16:45:01
ralf_b
tut mir leid aber deine datei ist bei mir noch auf dem alten Stand mit der falschen weekday() und ich baue die nicht alle um damit wenigstens das erledigt ist.
möglicherweise hilft es das application.enableevents auf false zu setzen im initialize.
Aber du solltest dein Programm besser kennenlernen und den Ablauf mal mit F8 durcharbeiten. Dann siehst du wie oft die Werte überschrieben werden.
Anzeige
AW: VBA Wochenfeiertag
20.12.2020 18:40:49
Peer
Hallo ralf_b.
Ich habe beide Varianten probiert.
Ich habe jetzt mit einer Select Case Anweisung eine Lösung finden wollen und habe mit MsgBox _ experimentiert.

Select Case Weekday(Cells(ActiveCell.Row, 2))
Case 2 To 6 And lbl_Kalendertag.ForeColor = 0
MsgBox Weekday(Cells(ActiveCell.Row, 2)) & ":  " & Format(CDate(Cells(ActiveCell.Row, 2) _
), "DDDD"), vbOKOnly, "normaler Wochentag"
Case 7
MsgBox Weekday(Cells(ActiveCell.Row, 2)) & ":  " & Format(CDate(Cells(ActiveCell.Row, 2) _
), "DDDD"), vbOKOnly, "Wochenende"
Case 1
MsgBox Weekday(Cells(ActiveCell.Row, 2)) & ":  " & Format(CDate(Cells(ActiveCell.Row, 2) _
), "DDDD"), vbOKOnly, "Wochenende"
Case 2 To 6 And lbl_Kalendertag.ForeColor = 255
MsgBox Weekday(Cells(ActiveCell.Row, 2)) & ":  " & Format(CDate(Cells(ActiveCell.Row, 2) _
), "DDDD"), vbOKOnly, "Wochenfeiertag"
Case 2 To 6 And lbl_Feiertag = "Heiligabend"
MsgBox Weekday(Cells(ActiveCell.Row, 2)) & ":  " & lbl_Feiertag, vbOKOnly, "Heiligabend" _
Case 2 To 6 And lbl_Feiertag = "Silvester"
MsgBox Weekday(Cells(ActiveCell.Row, 2)) & ":  " & lbl_Feiertag, vbOKOnly, "Silvester"
End Select
Wenn ich die Anweisung für den Wochenfeiertag aktivieren würde, werden die nachfolgenden Anweisungen ignoriert und am z.B "Heiligabend" kommt die MsgBox für den Wochenfeiertag statt Heiligabend.
Verstehe ich nicht. Alles andere funktioniert ja.
Gruß
Peer
Anzeige
AW: VBA Wochenfeiertag
20.12.2020 18:59:05
Peer
Habe die Reihenfolge geändert und es klappt nun.

Select Case Weekday(Cells(ActiveCell.Row, 2))
Case 2 To 6 And lbl_Kalendertag.ForeColor = 0
MsgBox Weekday(Cells(ActiveCell.Row, 2)) & ":  " & Format(CDate(Cells(ActiveCell.Row, 2) _
), "DDDD"), vbOKOnly, "normaler Wochentag"
Case 7
MsgBox Weekday(Cells(ActiveCell.Row, 2)) & ":  " & Format(CDate(Cells(ActiveCell.Row, 2) _
), "DDDD"), vbOKOnly, "Wochenende"
Case 1
MsgBox Weekday(Cells(ActiveCell.Row, 2)) & ":  " & Format(CDate(Cells(ActiveCell.Row, 2) _
), "DDDD"), vbOKOnly, "Wochenende"
Case 2 To 6 And lbl_Feiertag = "Heiligabend"
MsgBox Weekday(Cells(ActiveCell.Row, 2)) & ":  " & lbl_Feiertag, vbOKOnly, "Heiligabend" _
Case 2 To 6 And lbl_Feiertag = "Silvester"
MsgBox Weekday(Cells(ActiveCell.Row, 2)) & ":  " & lbl_Feiertag, vbOKOnly, "Silvester"
Case 2 To 6 And lbl_Kalendertag.ForeColor = 255
MsgBox Weekday(Cells(ActiveCell.Row, 2)) & ":  " & Format(CDate(Cells(ActiveCell.Row, 2) _
), "DDDD"), vbOKOnly, "Wochenfeiertag"
End Select

Aber...
Das funktioniert nur, wenn für den Tag noch keine "Ruhe" eingetragen wurde.
Wenn doch, dann wird statt der UF frm_Tag, wo beim Initialize die Zellwerte eingelesen werden, die MsgBox für "Wochenende" gestartet und danach erst frm_Tag.
Wie kann ich das verhindern?
Peer
Anzeige
AW: VBA Wochenfeiertag
20.12.2020 19:31:06
Peer
Nach langen Überlegungen und Versuchen habe ich das Problem gelöst.

Select Case Weekday(Cells(ActiveCell.Row, 2))
' normaler Wochentag
Case 2 To 6 And lbl_Kalendertag.ForeColor = 0
txt_ArbZ_Beginn.Value = ""
txt_ArbZ_Ende.Value = ""
txt_ArbZeit.Value = ""
'Samstag
Case 7
txt_ArbZ_Beginn.Value = ""
txt_ArbZ_Ende.Value = ""
txt_ArbZeit.Value = ""
' Sonntag
Case 1
txt_ArbZ_Beginn.Value = ""
txt_ArbZ_Ende.Value = ""
txt_ArbZeit.Value = ""
'Heiligabend
Case 2 To 6 And lbl_Feiertag = "Heiligabend"
txt_ArbZ_Beginn.Value = "07:00"
txt_ArbZ_Ende.Value = "14:30"
'Silvester
Case 2 To 6 And lbl_Feiertag = "Silvester"
txt_ArbZ_Beginn.Value = "06:00"
txt_ArbZ_Ende.Value = "12:30"
'Wochenfeiertag
Case 2 To 6 And lbl_Kalendertag.ForeColor = 255
txt_ArbZ_Beginn.Value = "08:00"
txt_ArbZ_Ende.Value = "15:48"
End Select
Vielen Dank ralf_b und Matthias für eure Hilfe.
LG
Peer
Anzeige
AW: VBA Wochenfeiertag
20.12.2020 21:52:20
ralf_b
ich verstehe nicht warum du den Zweiten Parameter der Weekdayfunktion so konsequent ignorierst.
deine Variante arbeitet mit Standard Sonntag als Wochenbeginn. Ist das dort wo du lebst so?
Wenn du den Wochenstart auf Montag setzt, dann rechnet sich es auch besser mit den Tagen.
ich hab dir mal deine select hier an diese Variante angepasst.
Select Case Weekday(Cells(ActiveCell.Row, 2), vbMonday)
'Samstag  u Sonntag
Case 6, 7
txt_ArbZ_Beginn.Value = ""
txt_ArbZ_Ende.Value = ""
txt_ArbZeit.Value = ""
Case Else
'Heiligabend
If lbl_Feiertag = "Heiligabend" Then
txt_ArbZ_Beginn.Value = "07:00"
txt_ArbZ_Ende.Value = "14:30"
'Silvester
ElseIf lbl_Feiertag = "Silvester" Then
txt_ArbZ_Beginn.Value = "06:00"
txt_ArbZ_Ende.Value = "12:30"
End If
'Wochenfeiertag
If lbl_Kalendertag.ForeColor = 255 Then
txt_ArbZ_Beginn.Value = "08:00"
txt_ArbZ_Ende.Value = "15:48"
' normaler Wochentag
ElseIf lbl_Kalendertag.ForeColor = 0 Then
txt_ArbZ_Beginn.Value = ""
txt_ArbZ_Ende.Value = ""
txt_ArbZeit.Value = ""
End If
End Select

AW: VBA Wochenfeiertag
20.12.2020 22:29:28
Peer
Hallo ralf_b.
Ich habe deine Version nicht ignoriert. Ich habe aber festgestellt, dass trotzdem immer Sonntag als Beginn ausgegeben wurde. Ich konnte mir nicht erklären, warum. Daher habe ich dies erstmal beiseite gelegt.
Vielen Dank für deine Zeilen.
Sie sind eine bessere Variante, als meine. Und ich habe wieder mal etwas von dir gelernt.
LG Peer

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige