10.10.2016, 20:51 (Dieser Beitrag wurde zuletzt bearbeitet: 10.10.2016, 20:52 von schauan.)
Hallo zusammen,
heute hab ich auch mal wieder eine Frage. War wieder beizeiten unterwegs und mir fallen nun eher die Augen zu als Gedanken für Lösungen Ich hab eine Übersicht von Zeitangaben "von bis", die zum Teil auch die Monatsgrenzen überschreiten. Maximal sind aus jetziger Sicht 3 Monate in einer Zeile enthalten, siehe hier Zeile 5. Pro Monat kann es aber mehrere Abschnitte geben, siehe Zeilen 2, 3 und 4 mit Daten vom Januar. Die Angaben betreffen jeweils ein Jahr, ohne Überschreitung der Jahresenden. Hier mal ein Auszug als Beispiel. In Spalte F meine "Nebenrechnung". Unter dem Auszug stehen die Feiertage des Beispielzeitraumes.
Ich brauche nun eine Gesamtübersicht der Tage je Monat. Vorteilhaft wäre eine Lösung ohne Hilfsspalten. Hat da jemand was in Petto
ich habe den Code mal noch etwas angepasst. Es gab wohl ein Problemchen, wenn ich nicht in jedem Monat Daten hatte.
Ich habe dann auch noch den Datenbereich zu einem Listobjekt zusammengefasst (Menü "Einfügen | Tabelle") und den Bereich mit den Feiertagen entsprechend benannt. Der Code sieht jetzt so aus:
Code:
Sub ArbeitstageProMonat() Dim rngFeier As Range Dim arrMonth(1 To 12) Dim iMonth1 As Integer, iMonth2 As Integer, iCnt As Integer Set rngFeier = ThisWorkbook.Worksheets("Tabelle1 (2)").Range("Feiertage") With ThisWorkbook.Worksheets("Tabelle1 (2)").ListObjects("Tabelle1") For iCnt = 1 To 12 iMonth1 = Month(.DataBodyRange(iCnt, 1)) iMonth2 = Month(.DataBodyRange(iCnt, 2)) If iMonth2 - iMonth1 = 0 Then arrMonth(iMonth1) = arrMonth(iMonth1) + _ Application.WorksheetFunction.NetworkDays(.DataBodyRange(iCnt, 1), .DataBodyRange(iCnt, 2), rngFeier) ElseIf iMonth2 - iMonth1 = 1 Then arrMonth(iMonth1) = arrMonth(iMonth1) + _ Application.WorksheetFunction.NetworkDays(.DataBodyRange(iCnt, 1), Application.WorksheetFunction.EoMonth(.DataBodyRange(iCnt, 1), 0), rngFeier) arrMonth(iMonth2) = arrMonth(iMonth2) + _ Application.WorksheetFunction.NetworkDays(DateSerial(Year(.DataBodyRange(iCnt, 2)), Month(.DataBodyRange(iCnt, 2)), 2), .DataBodyRange(iCnt, 2), rngFeier) ElseIf iMonth2 - iMonth1 = 2 Then arrMonth(iMonth1) = arrMonth(iMonth1) + _ Application.WorksheetFunction.NetworkDays(.DataBodyRange(iCnt, 1), Application.WorksheetFunction.EoMonth(.DataBodyRange(iCnt, 1), 0), rngFeier) arrMonth(iMonth1 + 1) = arrMonth(iMonth1 + 1) + _ Application.WorksheetFunction.NetworkDays(DateSerial(Year(.DataBodyRange(iCnt, 1)), Month(.DataBodyRange(iCnt, 1)) + 1, 2), _ Application.WorksheetFunction.EoMonth(DateSerial(Year(.DataBodyRange(iCnt, 1)), Month(.DataBodyRange(iCnt, 1)) + 1, 2), 0), rngFeier) arrMonth(iMonth2) = arrMonth(iMonth2) + _ Application.WorksheetFunction.NetworkDays(DateSerial(Year(.DataBodyRange(iCnt, 2)), Month(.DataBodyRange(iCnt, 2)), 2), .DataBodyRange(iCnt, 2), rngFeier) End If Next End With Sheets("Tabelle1 (2)").Range("E2:E13").Value = WorksheetFunction.Transpose(arrMonth) End Sub
. \\\|/// Hoffe, geholfen zu haben. ( ô ô ) Grüße, André aus G in T ooO-(_)-Ooo (Excel 97-2019+365)
16.10.2016, 16:49 (Dieser Beitrag wurde zuletzt bearbeitet: 16.10.2016, 16:49 von snb.)
Kann einfacher:
Code:
Sub M_snb() sn = Cells(1).CurrentRegion sp = Cells(7, 1).CurrentRegion ReDim st(12, 0)
For j = 2 To UBound(sn) For jj = sn(j, 1) To sn(j, 2) st(Month(jj), 0) = st(Month(jj), 0) + (Weekday(jj, 2) < 6) * IsError(Application.Match(jj, sp, 0)) Next Next
beide Codes bringen mit den Daten hier aus dem Beispiel in J2 für den Januar 13 und in J5 für den April 2. Im Februar und März wird leider nix ausgegeben.
. \\\|/// Hoffe, geholfen zu haben. ( ô ô ) Grüße, André aus G in T ooO-(_)-Ooo (Excel 97-2019+365)