Xtract: Erster Teil einer in einem Forum gestellten Frage, wie Anwesenheits-Tage von Mitarbeitern auf Monate zugeordnet werden können. PQ- und PivotTabele werden eingesetzt.
Wissensstand: Level 3 ⇒ Excel GUT!, mindestens Basis-Kenntnisse in Power Query
In einem Forum wurde die Frage gestellt, wie viele Tage pro Monat eine Person in einem definierten Zeitraum anwesend gewesen ist. Dabei sollten weder Wochenenden noch Feiertage unberücksichtigt bleiben, also wirklich alle Tage. Ich habe den Text der Fragestellung hier noch einmal aufgeführt:
Tage Pro Monat berechnen
Servus,
ich habe schon wild gegooglet aber bin leider nicht fündig geworden.
Ich muss eine Übersicht führen wie viele Tage Mitarbeiter im Monat vor Ort sind.
Aktuell gebe ich das Beginn und Enddatum ein und trage pro monat die Tage ein.
Gibt es eine Formel die mir die Arbeit beim Eintragen der einzelnen Tage pro Monat abnimmt ?
Hier geht es nur um die Tage gesamt, egal ob Wochenende oder Feiertag.
Da der Beginn und das Ende nicht immer am 01 bzw 30/31 eines monats sind, können sich hier evtl fehler einschleichen.
Als Beispiel habe ich eine vereinfachte Version der Liste im Anhang beigefügt.
Die im Foren-Beitrag angehängte Datei habe ich etwas ergänzt und Ihnen hier zur Verfügung gestellt. Die gelb-braun hinterlegten Bereiche entsprechen dem Original-File. Leider wird es scheinbar ein Zeichen der Zeit, dass sich Fragesteller in Foren extrem wenig Mühe geben, eine wirklich gute Vorlage für die Helfer zu „liefern”. Schade… 🙁 – Und noch ein Hinweis von meiner Seite: Bitte gehen Sie exakt nach meinen Anweisungen vor. Ich weiß, dass dieses oder jenes in Ihren Augen vielleicht nicht richtig ist; ich habe versucht, „Faktor Mensch” (also typische Fehler) einzubauen und diese dann im Endeffekt zu korigieren. Das bedeutet aber keinesfalls, dass die hier gezeigte Vorgehensweise (ohne Berücksichtigung der Fehler) das „non plus ultra” ist. PQ-Profis würden manches anders lösen, aber ich spreche in erster Linie typische Anwender mit einem gewissen Leistungsstand an.
Die erste Antwort im Forum (von steve1da) zeigt einen Weg auf, der imho mit einer relativ einfachen Formel auf der Basis Plain Excel wegweisend ist. Die weiter aufgeführten Möglichkeiten sind nicht immer für typische User auf den ersten oder auch zweiten Blick nachvollziehbar. 😉 Ich habe einen Weg gesucht und gefunden, das Problem mit Power Query zu lösen. Im ersten Teil des Beitrags habe ich mich exakt an die Vorgaben des Fragestellers gehalten. Im zweiten Teil habe ich das Feintuning dieser Lösung vorgenommen und die Aufgabe etwas erweitert, indem ich Wochenenden und Feiertage „ausgeklammert” habe. Das dürfte in vielen Fällen der Realität eher entsprechen. Die Vorgabe des Hilfe Suchenden könnte sich auf Personaleinsätze in weit entfernten Gebieten beziehen, wo eine Heimfahrt an Wochenenden bzw. auch an Feiertagen nicht sinnvoll ist.
Spätestens jetzt sollten Sie meine Muster-Datei herunterladen und erst einmal analysieren. Selbst wenn Sie der Meinung sind, dass ein anderer Aufbau der Lösung sinnvoll sein könnte (was auch auf mich zutrifft), der Fragesteller möchte das Ergebnis genau dieser Form haben und dem soll Genüge getan werden. Und bei der Gelegenheit ein weiterer Hinweis: Mitunter scheint sich ein Fehler oder Schreibfehler eingeschlichen zu haben. Belassen Sie es einfach dabei; erst wenn Sie an Ende des 2. Teils noch dieses oder jenes verbesserungswürdiges entdecken, bitte eine Nachricht an mich. Dieses oder jenes habe ich als typische Fehler eingebaut und Ihnen dann auch den Weg aufgezeigt, wie das Ganze wieder zu bereinigen ist. 😉
Markieren Sie zu Beginn die Daten aus dem Bereich A1:D5 und importieren Sie diese Werte anschließend in den Power Query-Editor. Achtung: Da die Zeile 2 leer ist, wird Ihnen beim Erstellen der Tabelle vorgeschlagen, dass die Tabelle keine Überschriften hat; hier sollten Sie das Häkchen bei Tabelle hat Überschriften unbedingt setzen. Im nächsten Schritt werden Sie auf beliebigem Wege alle leeren Zeilen entfernen (auch wenn es nur die Zeile 1 ist), den Datentyp der Spalten Beginn und Ende auf (nur) Datum anpassen und anschließend Datei | Schließen & laden in… | Nur Verbindung erstellen. Der erste Schritt ist getan.
Da ja für jeden Monat des Jahres eine eigene Spalte erstellt werden soll, muss diese irgendwie generiert werden; nicht für jeden Monat wurden Daten erfasst. In Plain Excel ist das naturgemäß sehr „elegant” lösbar: Januar in eine Zelle eingeben und dann 11 weitere Zellen nach rechts ziehen, schon existiert die Aufstellung. 😉 Möchten Sie das in Power Query abarbeiten, hilft Ihnen gewiss dieser Beitrag unseres Blogs. Und ja, das sind 12 Zeilen, aber das ist gar nicht einmal so schlecht, wie es vielleicht zu Anfang scheint. Es ist sogar genau das, was zielführend ist.
Sie haben jetzt also eine weitere Abfrage Monatsnamen, wo alle Monate von Januar bis Dezember als Text in der korrekten Reihenfolge aufgeführt sind. Auch diese Abfrage über Schließen & laden in… | Nur Verbindung erstellen sichern. Hinweis: Ohne die Tabelle mit jedem einzelnen Monate des Jahres würde Power Query für die Ausgabe der Daten nur jene Monate verwenden, die auch Daten enthalten, also mindestens ein Mitarbeiter tätig war.
Öffnen Sie nun wieder die erste Abfrage (Tabelle1). Es soll für jeden Mitarbeiter/jeden Datensatz eine Liste jener Tage erstellt werden, wo eine Anwesenheit gegeben war. Dazu gehen Sie so vor:
- Spalte hinzufügen | Benutzerdefinierte Spalte und tragen Sie bei Neuer Spaltenname beispielsweise Einsatztage ein.
- Im Feld Benutzerdefinierte Spaltenformel geben Sie nach dem = diese Formel unter Beachtung der exakten Groß- Kleinschreibung ein:
List.Dates([Beginn], Duration.Days([Ende]-[Beginn])+1, #duration(1,0,0,0))
- Erweitern Sie die Spalte Einsatztage durch einen Klick auf den Doppelpfeil und wählen Sie im Dialog Auf neue Zeilen ausweiten.
Sie haben jetzt für jeden Mitarbeiter für jeden Tag der Anwesenheit eine einzelne Zeile, also einen eigenen Datensatz. Gedanklich sollten Sie nun einen Schnitt machen, denn ab hier unterscheidet sich die Vorgehensweise etwas, wenn sie statt aller Tage des Bereichs Beginn bis Ende nur die typischen Arbeitstage, also ohne Wochenende und ohne Feiertage berechnen wollen. Mein Vorschlag: Merken Sie sich die Position des Eintrags im rechten Seitenfenster, da können Sie später die eine oder andere Funktionalität noch einfügen.
Hier geht es erst mal mit der vom Fragesteller definierten Aufgabe weiter, also die Anwesenheitstage für jede Person pro Monat und entsprechend auch dem Gesamt-Zeitraum zu berechnen.
- Wenn Sie eher der „Kontrollfreak” sind, dann werden Sie erst einmal die Spalte Einsatztage und dann über Spalte hinzufügen | Datum | Monat | Name des Monats gehen, um den entsprechenden Monatsnamen als Text zu erstellen. Sie können Power Query aber auch vertrauen und die Spalte Einsatztage direkt über Transformieren | Datum | Monat | Namen des Monats in den Text des Monats umwandeln.
- Um die Performance bei umfangreicheren Dateien zu erhöhen, löschen Sie nun alle Spalten außer Name, Vorname und Einsatztage; nur diese werden noch gebraucht.
- Markieren Sie nun (in dieser Reihenfolge) die Spalten Name, Vorname, Einsatztage und wählen Sie per Rechtsklick in eine der Überschriften den Kontextmenü-Punkt Gruppieren nach…
Das Textfeld Neuer Spaltenname noch anpassen (siehe Abbildung) und dann OK. Das Ergebnis sollte prinzipiell überzeugen:
Spätestens jetzt sollten Sie den Namen der Spalte Einsatztage in Einsatzmonate ändern, was ja eher den Gegebenheiten entspricht. – Auf den allerersten Blick scheint es vielleicht so zu sein, dass die Monatsnamen etwas durcheinander sind; aber nach einer kurzen Analyse werden Sie feststellen, dass innerhalb jedes Mitarbeiters die Reihenfolge in korrekter kalendarischen Abfolge gegeben ist.
Jetzt geht es „nur” noch darum, diese Daten in die gewünschte Form der Kreuztabelle zu übertragen. Meine erste Idee, die Abfrage Monatsnamen über Transformieren | Vertauschen in die horizontale Form zu „kippen”, habe ich rasch verworfen. Der Aufwand des korrekten Zusammenführens wäre zu groß. Darum zeige ich Ihnen einen anderen Weg auf.
Wechseln Sie zu Abfrage Monatsnamen. Spalte hinzufügen | Indexspalte | Von 1 um einen den Monatsnamen entsprechenden numerischen Wert zu erzeugen. Ein „normaler” Index würde ja mit 0 beginnen, was für Power Query natürlich kein Problem darstellen würde, uns Anwender aber jedes Mal zum Umdenken animiert; wir sind eher die „echten” numerischen Bezeichnungen der Monate gewohnt. 😉
Im nächsten Schritt gehen Sie über Start | Kombinieren | Abfragen zusammenführen und wählen Sie im unteren Bereich des Fensters die Abfrage Tabelle1; verknüpfen Sie die beiden Abfragen dergestalt, dass die beiden Spalten mit den Monatsnamen markiert sind und verwenden Sie die Vorgabe bei Join-Art.
Erweitern Sie nach dem OK die Spalte Tabelle1. Anschließend sortieren Sie die Spalte Index, löschen die Spalte Column1 und Sie haben erst einmal ein Ergebnis. Jetzt aber kommt die 100.000 €-Frage: Obwohl Power Query alles korrekt berechnet hat, ist das Ergebnis nicht dem eigentlich gewünschten Ziel entsprechend; warum nicht? 😕
Diese Frage werde ich im nächsten Teil dieser Aufgabenstellung beantworten und natürlich auch aufzeigen, wie Sie den „gordischen Knoten” durchschlagen (sprich: diese oder jene Lösung erarbeiten) können und wie Sie die Daten das gewünschte Ziel-Format der Kreuztabelle bringen werden.
Versuchen Sie aber gerne schon einmal an dieser Stelle für das gegebene Format die Gesamt-Tage der einzelnen Monate zu berechnen. Gerne mit oder ohne Berücksichtigung des logischen Fehlers in der Abfrage. In jedem Falle sollte das über Gruppieren nach… gehen, eine andere Lösung ist auch gut machbar. Ach ja, mein Ergebnis (mit dem noch nicht ganz korrekten/erwünschten Ergebnis) können Sie hier herunterladen.
Der 2. Teil dieses Beitrags wird/wurde 14 Tagen nach der Veröffentlichung online gestellt und hat diesen Link.