Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: nur Werktage berechnen

nur Werktage berechnen
06.05.2020 16:52:32
Wolfgang
Hallo,
den nachfolgenden Code konnte ich hier im Forum recherchieren und ich habe ihn auch soweit getestet. Was muss ich machen, damit der Code "nur" die Werktage berechnet bzw. aus den Werktagen ein Datum errechnet (derzeit bezieht er auch offensichtlich Wochenenden mit ein)? Herzlichen Dank schon jetzt für die Rückmeldung und viele Grüße - Wolfgang
  • 'anhand der Wochen das Enddatum in TB10 errechnen lassen
    Private Sub TextBox10_Change()
    On Error Resume Next 'Abfangen, wenn Textbox 5 leer
    TextBox6 = CDate(TextBox5) + 5 * CLng(TextBox10) - 1
    TextBox7 = ""
    End Sub
    

  • Anzeige

    18
    Beiträge zum Forumthread
    Beiträge zu diesem Forumthread

    Betreff
    Datum
    Anwender
    Anzeige
    AW: nur Werktage berechnen
    06.05.2020 16:53:56
    Hajo_Zi
    benutze in Tabelle
    =NETTOARBEITSTAGE()
    GrußformelHomepage
    Danke, Hajo - wäre evtl. VBA auch denkbar?
    06.05.2020 18:18:55
    Wolfgang
    Hallo Hajo,
    vielen lieben Dank für die schnelle Rückmeldung und den Hinweis auf eine mögliche Tabellenformel. Ich habe den Part in einem UF mit diversen anderen Boxes etc. implementiert. Wäre denkbar, diesen Hinweis auch in VBA hinzubekommen? - Das fände ich sehr toll. - Vielen Dank schon jetzt für die Rückantwort(en) und herzliche Grüße - Wolfgang
    Anzeige
    AW: Danke, Hajo - wäre evtl. VBA auch denkbar?
    06.05.2020 18:39:43
    Hajo_Zi
    excel hat auch einen Makrorecorder.
    Gruß Hajo
    AW: Danke, Hajo - wäre evtl. VBA auch denkbar?
    06.05.2020 23:13:34
    Martin
    Hallo Wolfgang,
    auch du bist unserem Forenclown Hajo_Zi zum Opfer gefallen ;-)
    Immer wenn Hajo_Zi überfordert wird, gibt er so stumpfsinnige Antworten. Also der Makrorecorder würde niemals deine Frage beantworten bzw. folgendes aufzeichnen:
    WorksheetFunction.NetworkDays(dDatumAnfang,dDatumEnde)
    
    Viele Grüße
    Martin
    Anzeige
    Danke, Martin - Verständnisfrage
    07.05.2020 09:42:54
    Wolfgang
    Hallo Martin,
    zunächst vielen vielen Dank! - Ich hatte mir schon fast die Zähne ausgebissen und mir dem Makrorekorder nichts hinbekommen. Ich habe Deinen Hinweis soweit aufgegriffen und versucht, den Code anzupassen - siehe unten - Hast Du evtl. eine Idee, wie sich das Ergebnis, welches ja momentan die Werktage ausweist (das ist ja gut so und gewollt) in Wochen anzeigen lässt? - Herzlichen Dank schon jetzt für Deine Rückmeldung.
    nachfolgend mein Änderungs,-Anpassungsversuch
  • 'anhand der Wochen das Enddatum in TB10 errechnen lassen
    Private Sub TextBox10_Change()
    On Error Resume Next 'Abfangen, wenn Textbox 5 leer
    'TextBox6 = CDate(TextBox5) + 5 * CLng(TextBox10) - 1 'hier steht die vorherige Formel
    Dim datStart As Date
    Dim datEnd As Date
    datStart = CDate(Me.TextBox5.Value)
    datEnd = CDate(Me.TextBox6.Value)
    Me.TextBox10 = Application.NetworkDays(datStart, datEnd)
    TextBox7 = ""
    End Sub
    

  • Anzeige
    AW: Danke, Martin - Verständnisfrage
    07.05.2020 10:03:49
    Martin
    Hallo Wolfgang,
    leider bin ich mir nicht sicher wie du deine Frage meinst. Vermutlich möchtest du unabhängig von Feiertagen und Wochenenden die Wochen zwischen zwei Kalendertagen ermitteln. Dafür eignet sich die Funktion DATEDIF.
    Wenn du aber eine Woche mit 5 oder 7 Nettoarbeitstagen betrachtest, musst du das Ergebnis von NetworkDays lediglich durch 5 bzw. 7 teilen.
    Viele Grüße
    Martin
    Anzeige
    AW: Danke, Martin - Verständnisfrage
    07.05.2020 14:22:12
    Wolfgang
    Hallo Martin,
    vielen Dank für Deine erneute Rückmeldungen und Hilfestellungen. Ich konnte das nun mit NetworkDays so umsetzen und mir werden nun die Wochen (Berechnung ohne Wochenenden, also, dividiert durch 5) angezeigt. Bei der jetzigen Formel, die somit nun m.E. gut läuft, wird auf Grund zweier TextBoxes die Zeitdifferenz in Wochen in TextBox 10 angezeigt. Hättest Du evtl. da noch eine Idee, wenn ich den umgekehrten Weg noch einbauen möchte und in TextBox10 die Anzahl der Wochen eingebe, in Textbox5 das Startdatum eingebe und mir dann in Textbox6 das Enddatum errechnet und angezeigt werden soll -mit 5-Tage-Woche-? - Vielen Dank schon jetzt und herzliche Grüße - Wolfgang
    Anzeige
    AW: Danke, Martin - Verständnisfrage
    08.05.2020 02:39:08
    Martin
    Hallo Wolfgang,
    ich habe dir versucht eine passende Funktion zu schreiben:
    
    Function NetworkDate(dteStart As Date, iWeeks As Integer) As Date
    Dim j As Integer
    Do Until Application.NetworkDays(dteStart, dteStart + j) / 5 >= iWeeks
    j = j + 1
    Loop
    NetworkDate = dteStart + j
    End Function
    
    Du übergibst der Funktion zwei Argumente: Für dteStart übergibst du das Startdatum und für iWeeks die Anzahl der Wochen.
    Wenn du also mit dem Datum von heute zwei Arbeitswochen angibst, sieht der Aufruf so aus:
    Sub Beispiel()
    MsgBox NetworkDate("08.05.2020", 2)
    End Sub
    
    Als Ergebis wird der 21.05.2020 ermittelt.
    Viele Grüße
    Martin
    Anzeige
    sorry, brauche doch noch Hilfe
    08.05.2020 08:54:28
    Wolfgang
    Hallo Martin,
    zunächst wieder tausend Dank für die weiteren Ausarbeitungen und den Code bzw. die Funktion. Ich hatte angenommen, dass ich es nun schaffe, den Code auf meine Belange anzupassen. Leider gelingt mir das nicht. Siehst Du da noch eine Chance, mir zu helfen? - Fallgestaltung: in TextBox5 steht der Starttermin, in TextBox10 sind die Wochen eingetragen und in TextBox6 sollte dann das ermittelte Datum erscheinen. Wäre schön, wenn Du da noch Möglichkeiten siehst. Herzlichen Dank schon jetzt wieder.
    Viele Grüße - Wolfgang
    Anzeige
    AW: sorry, brauche doch noch Hilfe
    08.05.2020 10:20:55
    Martin
    Hallo Wolfgang,
    hier nur ein kurzes Beispiel zum Aufruf der Funktion direkt mit den Daten aus den Textfeldern:
    Private Sub TextBox10_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    If IsNumeric(TextBox10) And IsDate(TextBox5) Then
    TextBox6 = NetworkDate(CDate(TextBox5), CInt(TextBox10))
    End If
    End Sub
    Private Sub TextBox5_Change()
    If IsNumeric(TextBox10) And IsDate(TextBox5) Then
    TextBox6 = NetworkDate(CDate(TextBox5), CInt(TextBox10))
    End If
    End Sub
    
    Ich habe jetzt das KeyUp-Ereignis der TextBox10 (Anzahl der Wochen) und das Change-Ereignis der TextBox5 (Startdatum) verwendet, dadurch wird die Berechnung nur durch manuelle Eingabe der Wochenanzahl in TextBox10 ausgelöst und durch prinzipielle Änderungen der TextBox5. Du solltest deine Steuerelemente nach der Ungarischen Notation bezeichnen, um den Überblick zu behalten. Also statt TextBox5 zum Beispiel txtStartDatum und aus TextBox10 könnte man txtArbeitswochen machen.
    Viele Grüße
    Martin
    Anzeige
    AW: sorry, brauche doch noch Hilfe
    08.05.2020 11:24:41
    Martin
    Hallo Wolfgang,
    ich möchte dir noch einen kleinen Hinweis zum Sonderfall "Feiertage" geben. Die Funktion NetworkDays ist in der Lage Feiertage zu berücksichtigen, allerdings musst du die Feiertage separat definieren. Berücksichtige dabei, dass deine Datei auch über den Jahreswechsel hinaus die Feiertage korrekt kennen sollte.
    Deshalb habe ich dir hier mal ein kleines Beispiel gemacht, bei dem der Feiertag "Heilige drei Könige" am 6. Januar für das stets laufende und das kommende Jahr bei der Berechnung der Arbeitstage berücksichtigt wird. Die Liste arrHolidays kannst du beliebig erweitern:
    Sub HolidayList() 'Am Beispiel 6. Januar ("Heilige drei Könige")
    Dim arrHolidays() As Variant
    Dim dteStart As Date, dteEnd As Date
    dteStart = "06.01.2020"
    dteEnd = "08.01.2020"
    arrHolidays = Array(CLng(DateSerial(Year(Date), 1, 6)), CLng(DateSerial(Year(Date) + 1, 1,  _
    6))) 'Feiertag(e)
    MsgBox "Arbeitstage ohne Heilige drei Könige: " & Application.NetworkDays(dteStart, dteEnd)
    MsgBox "Arbeitstage mit Heilige drei Könige: " & Application.NetworkDays(dteStart, dteEnd,  _
    arrHolidays)
    End Sub
    
    Bei beweglichen Feiertagen (z.B. Karfreitag und Ostermontag) müssen die Termine separat berechnet werden (...findest du hier im Forum in der Recherche).
    Viele Grüße
    Martin
    Anzeige
    AW: sorry, brauche doch noch Hilfe
    08.05.2020 11:46:25
    Wolfgang
    Hallo Martin,
    Danke!!! - ich konnte die Hinweise und Ausarbeitungen soweit umsetzen und einbauen - auch Deine Hinweise bzgl. der Notation (hatte ich zuvor noch nicht realisiert) werde ich umsetzen. Beim Testen fiel mir auf, dass Teilwochen möglicherweise nicht berechnet werden (?). Ich hatte einmal versucht, im Hinblick auf 5-Tage-Woche, den Zeitraum für zwei Tage, also 0,4 Wochen einzugeben, dieses wird irgendwie nicht umgesetzt - bei z.B. Start 11.05., bleibt es beim 11.05. - gebe ich dann 0,6 Wochen ein, springt der Code direkt auf den 15.05.20. - Hättest Du da evtl. noch eine Idee? (es kommt hier tatsächlich häufiger vor, dass wir einen Wochenanteil von zwei oder drei Tagen i.d. Tabelle eintragen). Herzlichen Dank schon jetzt wieder. - Viele Grüße - Wolfgang
    Anzeige
    AW: sorry, brauche doch noch Hilfe
    08.05.2020 12:19:57
    Martin
    Hallo Wolfgang,
    weil du nur mir diese Anforderung erst jetzt schreibst, bin ich mal gemein und fordere dich auf das Problem selbst zu lösen ;-)
    Im Prinzip habe ich schon alles programmiert, aber mit dem Variablentyp Integer. Leider unterstützt Integer nur ganze Zahlen. Also müssen wir auf einen anderen Variablentypen ausweichen, der auch Nachkommastellen versteht. Nur welchen? :-)
    Sieh mal hier:
    https:\/\/www.herber.de/mailing/vb/html/vagrpdatatype.htm
    Ich bin jetzt ohnehin eine Weile unterwegs. Versuche das Problem mal selbst zu lösen. Ich bin gespannt wie weit du kommst.
    Viele Grüße
    Martin
    Anzeige
    Danke - ich versuche!
    08.05.2020 12:27:40
    Wolfgang
    Hallo Martin,
    wieder vielen Dank für Deine schnelle Rückmeldung und auch vielen Dank für den Link und die erneuten Hinweise. Ich werde mich gerne versuchen, das ist vollkommen richtig, dass es mir damit nur weiterhilft. Du hast mir schon sehr viel geholfen und Hilfestellungen gegeben, Danke auch da für Deine Geduld. Ich werde, wenn ich meine, den Weg gefunden zu haben, mich wieder in diesem Thread melden. Soweit Dir alles Gute und nochmals tausend Dank. - Viele Grüße - Wolfgang
    Anzeige
    AW: Danke - ich versuche!
    09.05.2020 11:50:45
    Martin
    Hallo Wolfgang,
    eigentlich fand ich meine Aufgabenstellung relativ einfach: Es hätte nur die Integer-Variable für die Wochenanzahl der Funktion NetworkDate durch z.B. eine Double-Variable ersetzt werden müssen. Es hätten sogar viele andere Variablentypen auch funktioniert (z.B. Single, Currency, Variant), da ihre Gültigkeitsbereiche für deinen benötigten Zahlenbereich alle passen.
    Also die Funktion könnte so angepasst werden:
    Function NetworkDate(dteStart As Date, dblWeeks As Double) As Date
    Dim j As Integer
    Do Until Application.NetworkDays(dteStart, dteStart + j) / 5 >= dblWeeks
    j = j + 1
    Loop
    NetworkDate = dteStart + j
    End Function
    
    Damit ich und fremde Programmierer den Code besser verstehen, verwende ich die Ungarische Notation. Aus dem Grund habe ich die Variablenbezeichnung von ehemals iWeeks (für Integer) auf dblWeeks (für Double) geändert. Somit ist die Verwendung dieser Variable besser nachvollziehbar.
    Viele Grüße
    Martin
    Anzeige
    Danke, Martin!!!!
    09.05.2020 19:39:54
    Wolfgang
    Hallo Martin,
    ich hatte mit Deiner Rückmeldung noch gar nicht gerechnet. Umsomehr freut mich diese. Ich hatte mich weiter versucht, die Änderung hinzubekommen, bislang tatsächlich aber noch nicht so erfolgreich. Ich konnte Dank Deiner Verlinkung zu den Variablen auch schon feststellen, dass bei Nachkomma wohl zwei Varianten - Single und Double bestehen. Die jeweiligen Kürzel hierfür, wie Du Sie nun beschreibst hätte ich dabei nicht "draufgehabt". Der Code, wie Du ihn netterweise angepasst hast, läuft wunderbar und berücksichtigt nun auch einzelne Wochentage. Herzlichen Dank dafür, Martin - Danke aber auch für Deine Geduld mit mir. - Herzliche Grüße - Wolfgang
    Anzeige
    AW: Danke, Martin!!!!
    10.05.2020 00:49:39
    Martin
    Hallo Wolfgang,
    vielen Dank für dein positives Feedback. Es freut mich, dass nun alles nach deinen Vorstellungen funktioniert. Übrigens noch ein kleiner Tipp am Rande: Benutzerdefinierte VBA-Funktionen können auch als Formeln verwendet werden. Wenn der Code in einem normen Modul steht, brauchst du in die Zelle nur die Excelformel "=Networkdate(Heute();2)" schreiben, um das Datum des letzten Nettoarbeitstages nach zwei Wochen zu ermitteln.
    Viele Grüße
    Martin
    Anzeige
    ;

    Forumthreads zu verwandten Themen

    Anzeige
    Anzeige
    Anzeige
    Anzeige
    Anzeige
    Anzeige

    Infobox / Tutorial

    Werktage in Excel berechnen und anzeigen


    Schritt-für-Schritt-Anleitung

    1. Verwendung der Funktion NETTOARBEITSTAGE(): Um die Anzahl der Werktage zwischen zwei Daten zu zählen, kannst du die Funktion NETTOARBEITSTAGE() nutzen. Der Syntax lautet:

      =NETTOARBEITSTAGE(Startdatum, Enddatum)

      Diese Formel zählt automatisch die Arbeitstage und ignoriert Wochenenden.

    2. VBA-Anpassung für benutzerdefinierte Berechnungen: Wenn du die Werktage in einer benutzerdefinierten Funktion verwenden möchtest, kannst du folgenden VBA-Code nutzen:

      Function NetworkDate(dteStart As Date, dblWeeks As Double) As Date
         Dim j As Double
         Do Until Application.NetworkDays(dteStart, dteStart + j) / 5 >= dblWeeks
             j = j + 1
         Loop
         NetworkDate = dteStart + j
      End Function

      Diese Funktion ermöglicht es dir, das Enddatum basierend auf einem Startdatum und einer Anzahl von Wochen zu berechnen.

    3. Feiertage berücksichtigen: Um Feiertage in die Berechnung der Werktage einzubeziehen, füge eine Liste von Feiertagen als drittes Argument in die Funktion NETTOARBEITSTAGE() ein:

      =NETTOARBEITSTAGE(Startdatum, Enddatum, Feiertage)

    Häufige Fehler und Lösungen

    • Fehler: Falsches Datum
      Wenn du ein ungültiges Datum eingibst, gibt Excel einen Fehler zurück. Achte darauf, dass die Daten im richtigen Format eingegeben werden (z.B. TT.MM.JJJJ).

    • Fehler: Feiertage nicht erkannt
      Stelle sicher, dass die Feiertagsliste korrekt definiert ist und die Datumsangaben im richtigen Format vorliegen.

    • Fehler: Ergebnis ist 0
      Dies kann darauf hindeuten, dass die Daten die gleichen Tage sind oder nur auf Wochenenden fallen. Überprüfe die eingegebenen Daten.


    Alternative Methoden

    • DATEDIF-Funktion:
      Um die Anzahl der Arbeitstage zwischen zwei Daten zu berechnen, könntest du auch die DATEDIF-Funktion verwenden, um die Gesamtdauer zu ermitteln und dann die Wochenenden und Feiertage abzuziehen.

    • Makrorecorder:
      Mit dem Makrorecorder in Excel kannst du eine Funktion aufzeichnen, die dir hilft, die benötigten Schritte zu automatisieren, um die Werktage zu zählen.


    Praktische Beispiele

    1. Anzahl der Werktage zwischen zwei Daten:

      =NETTOARBEITSTAGE("01.05.2020", "15.05.2020")

      Diese Formel gibt die Anzahl der Werktage zwischen dem 1. und 15. Mai 2020 zurück.

    2. Berechnung mit Feiertagen:

      =NETTOARBEITSTAGE("01.05.2020", "15.05.2020", {"06.05.2020"})

      Hier wird der 6. Mai als Feiertag berücksichtigt.

    3. VBA für benutzerdefinierte Berechnung:

      Sub Beispiel()
         MsgBox NetworkDate("08.05.2020", 2)
      End Sub

      Diese Subroutine gibt das Datum nach zwei Arbeitswochen ab dem 8. Mai 2020 aus.


    Tipps für Profis

    • Ungarische Notation:
      Verwende die ungarische Notation für Variablen im VBA-Code, um die Lesbarkeit und Wartbarkeit zu erhöhen.

    • Feiertagslisten pflegen:
      Halte deine Feiertagsliste aktuell, insbesondere bei beweglichen Feiertagen, um korrekte Berechnungen sicherzustellen.

    • Benutzerdefinierte Formeln:
      Du kannst benutzerdefinierte VBA-Funktionen auch direkt in Excel als Formeln verwenden, was die Flexibilität erhöht.


    FAQ: Häufige Fragen

    1. Wie zähle ich nur die Werktage in einem bestimmten Jahr?
    Verwende die NETTOARBEITSTAGE()-Funktion und setze das Start- und Enddatum auf den gewünschten Zeitraum des Jahres.

    2. Was mache ich, wenn ich Teilwochen berücksichtigen möchte?
    Ändere den Datentyp der Variablen in deinem VBA-Code von Integer zu Double, um auch Dezimalwerte zu unterstützen.

    3. Wie kann ich Feiertage in meine Berechnung einbeziehen?
    Definiere eine Liste von Feiertagen und füge diese als drittes Argument in die NETTOARBEITSTAGE()-Funktion ein.

    Beliebteste Forumthreads (12 Monate)

    Anzeige
    Anzeige
    Entdecke mehr
    Finde genau, was du suchst

    Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

    Suche nach den besten Antworten
    Unsere beliebtesten Threads

    Entdecke unsere meistgeklickten Beiträge in der Google Suche

    Top 100 Threads jetzt ansehen
    Anzeige