Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1756to1760
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

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
    

  • 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
    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
    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
    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
    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
    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
    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

    Links zu Excel-Dialogen

    Beliebteste Forumthreads (12 Monate)

    Anzeige

    Beliebteste Forumthreads (12 Monate)

    Anzeige
    Anzeige
    Anzeige