Hallo,
ich habe die unten aufgeführte VBA Funktion gefunden um die Wochenenden zu ignorieren, allerdings funktioniert das nicht bei einem Montag und auch nicht wenn die Anzahl an Differenztagen etwas größer ist. Wie muss ich den Code umschreiben, dass immer auf den entsprechenden Werktag vor oder zurück gerechnet wird? Sprich, dass die Wochenenden komplett in der Zählung ignoriert werden.
Beispiel:
Wochentag(Montag) -2 = Donnerstag
Wochentag(Montag) -3 = Mittwoch
Wochentag(Montag) +5 = Montag
Wochentag(Montag) +6 = Dienstag
Function FindeWerktag(datStart As Date, intDifferenz As Integer) As Date
Dim datWerktag As Date
datWerktag = datStart + intDifferenz
Select Case Weekday(datWerktag, vbMonday)
Case 7 'Sonntag
If intDifferenz > 0 Then
datWerktag = datWerktag + 1
Else
datWerktag = datWerktag - 2
End If
Case 6 'Samstag
If intDifferenz > 0 Then
atWerktag = datWerktag + 2
Else
datWerktag = datWerktag - 1
End If
End Select
FindeWerktag = datWerktag
End Function
Hallo,
so etwas löst man in einer Datenbank mit einer Kalendertabelle.
Da lassen sich vielfältige Datumsfunktionen ableiten. Außerdem können auch noch ganz einfach feiertage integriert werden.
Im Anhang ein Beispiel zur Anpassung.
PS:
Bitte für Codedarstellunge die Codetags benutzen.
Ich denke auch, dass es sich mit einer Kalendertabelle wesentlich eleganter und vielseitiger lösen lässt.
Feiertage sind ein Thema. Und wenn Wochenendtage nicht gezählt werden sollen, sprechen wir vermutlich von Arbeitstagen (Samstag ist auch ein Werktag). Und da kann ja jeder Arbeitnehmer wieder andere Arbeitstage haben, auch Samstage und Sonntage. Ich fand die Aufgabenstellung aber witzig und deshalb habe ich mal einen Code zusammengebastelt.
Function FindeWerktag(datStart As Date, intDifferenz As Integer) As Date
Dim intWochenendtage As Integer
' Wenn an einem Samstag oder Sonntag gestartet wird (positive Werte)
If Weekday(datStart, vbMonday) > 5 And intDifferenz > 0 Then
intDifferenz = intDifferenz + (7 - Weekday(datStart, vbMonday))
' Wenn an einem Sonntag gestartet wird (negative Werte)
ElseIf Weekday(datStart, vbMonday) = 7 And intDifferenz < 0 Then
intDifferenz = intDifferenz - 1
' Wenn das Ergebnis auf oder nach ein Wochenende fällt (positive Werte)
ElseIf Weekday(datStart, vbMonday) + intDifferenz > 5 Then
intDifferenz = intDifferenz + 2
' Wenn das Ergebnis auf oder nach ein Wochenende fällt (negative Werte)
ElseIf Weekday(datStart, vbMonday) + intDifferenz < 1 Then
intDifferenz = intDifferenz - 2
End If
' Wenn mehr als eine Woche addiert wird (1 Woche = 5 Arbeitstage)
If intDifferenz > 7 Then
intWochenendtage = (Int((intDifferenz - 7) / 5) * 2)
ElseIf intDifferenz < -7 Then
intWochenendtage = (Int((intDifferenz + 7) / 5) * 2)
End If
FindeWerktag = datStart + intDifferenz + intWochenendtage
End Function
LG
Martin
Zitat von: Martin H. am März 23, 2022, 17:06:40Ich fand die Aufgabenstellung aber witzig und deshalb habe ich mal einen Code zusammengebastelt.
Die Aufgabenstellung an sich finde ich nicht witzig - eher Deinen Code-Vorschlag.
Eine Kaskade von If und ElseIf, die sich - nach Bedarf - noch um etliche Zeilen verlängern ließe, ist in einem DBMS ein schlechter Witz.
Klaus' Hinweis auf die Nutzung einer Kalendertabelle ist m. E. der einzig gangbare Weg. Den kann man mit Access-Bordmitteln gehen und benötigt dafür keine Zeile Code.
Wow, warum so freundlich? Aber langsam bekomme ich den Eindruck das gehört zum guten Ton in diesem Forum.
Ich habe doch schon geschrieben, dass ich Klaus zustimme.
Trotzdem fand ich es interessant und habe es halt in VBA gelöst und den Threaderstellter daran teilhaben lassen. Was er draus macht ist doch seine Sache.
Genieß die Sonne
Martin