17.09.2020, 10:03 (Dieser Beitrag wurde zuletzt bearbeitet: 17.09.2020, 10:51 von betzie_hh.)
Moin zusammen,
ich möchte gerne Arbeitstage von einzelnen Mitarbeitern zählen. Ich habe in Spalte A das Datum und in Spalte B die Namen. Das Datum kommt jeweils pro Mitarbeiter mehrfach vor und nicht jeder Mitarbeiter arbeitet jeden Tag.
Auf dem zweiten Tabellenletzte benötige ich die Auswertung wie viele Arbeitstage der jeweilige Mitarbeiter gearbeitet hat.
Sorry, wusste nicht, dass es so relevant ist das Pivot nicht in Frage kommt.
Wie gesagt, Die Auswertung der Arbeitstage ist nur ein ganz kleiner Teil einer großen Statistik die ohne Pivot auskommen muss da aus verschiedenen Dateien dort etwas zusammen getragen wird. Und ich kann das nicht in verschiedenen Tabellen aufteilen in der eine Tabelle eine Pivot ist und der Rest mit Formeln hinterlegt.
zum Tagezählen könnte man für jeden Namen die Anzahl unterschiedlicher Datumsangaben zählen oder man kann, wie es der Code unten macht, jede Zeile der Tabelle durchgehen ("For i = 2 To UBound(a)") und in einer Liste für jeden Namen eine Liste mit allen unterschiedlicher Datumsangaben von diesem Namen eintragen, also Liste in Liste. Diese Listen nennt man Dictionary. Ihre Einträge sind mit einer eindeutigen Bezeichnung versehen, auch Key genannt. Die Einträge der Namensliste sind also Datumslisten und mit dem Namen gekennzeichnet (Key). Für die Auswertung werden alle Namen der Namensliste ("For i = 0 To .Count - 1") und die Größe der Datumslisten (Anzahl der Einträge) tabellarisch dargestellt.
Code:
Sub Datensummen() Dim a, b Dim Ecke As Range Dim i As Long Dim Name As String
a = Worksheets("Tabelle1").Range("a1").CurrentRegion Set Ecke = Worksheets("Tabelle2").Range("A2")
With CreateObject("Scripting.Dictionary") For i = 2 To UBound(a) Name = a(i, 2) If Not .Exists(Name) Then .Add Name, CreateObject("Scripting.Dictionary") .Item(Name).Item(a(i, 1)) = 1 Next i ReDim b(1 To .Count, 1 To 2) For i = 0 To .Count - 1 b(i + 1, 1) = .keys()(i) b(i + 1, 2) = .Items()(i).Count Next i End With Ecke.Resize(UBound(b, 1), UBound(b, 2)) = b End Sub
Damit wird auf Knopfdruck Deine Liste erzeugt, eine frühere Liste übeschrieben, der überstehende Bereich aber nicht gelöscht (vorsicht).
Du hast eingangs gefragt, "Wer kann helfen?" und hast drei qualitativ hochwertige Antworten bekommen. Bist Du noch am probieren oder gibt es andere Gründe, warum Du damit nicht klar kommst? Habe gesehen, dass auch bei einer früheren Deiner Anfragen die Antwort, möglicherweise die Lösung Deines Excel-Problems, von Dir noch nicht akzeptiert wurde. Die Antworten passieren nicht versehentlich, sondern bewusst absichtlich, mit dem Ziel, Deine Frage bestmöglich zu beantworten.