Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Werktage über VBA

Begonnen von Sverki2103, März 23, 2022, 12:58:55

⏪ vorheriges - nächstes ⏩

Sverki2103

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

MzKlMu

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.
Gruß Klaus

Martin H.

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

Maxel

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.
Viele Grüße
Maxel

Martin H.

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