Wissensstand: Level 1 ⇒ Einsteiger in PQ, keine/kaum Erfahrung
Minuten-Gewurschtel 🙄
Es gibt Zeiterfassungs-Systeme, welche ein sehr eigenwilliges Format in ein File ausgeben. Schauen Sie sich einmal die folgende Tabelle an, wo in der Spalte Erfassung die maschinell erfassten Zeiten stehen und in der Spalte Reale Zeit die Zeiten, wie sie durch Excel „vernünftig” verarbeitbar sind:
Erfassung | Reale Zeit |
3,5 | 3:50 |
2,45 | 2:45 |
6,1 | 6:10 |
4,07 | 4:07 |
0,33 | 0:33 |
5 | 5:00 |
Nochmals zur Verdeutlichung: Zu Beginn existieren ausschließlich die Werte aus der Spalte Erfassung, die zweite Spalte soll erst noch berechnet werden. Besonders in der ersten Datenzeile unter den Überschriften ist die Diskrepanz zwischen dem typischen Verständnis durch die Excel-Nutzer und dem eigentlichen, korrekten Ergebnis sichtbar; der erfasste Wert 3,5 entspricht keineswegs 3 ½ Stunden, was ja 3:30 wäre. Nein, der ganzzahlige Teil entspricht tatsächlich den Stunden, der Nachkomma-Anteil soll die realen Minuten darstellen. Wobei das auch nicht so wirklich der Excel-Welt entspricht, denn eigentlich müssten die erfassten Zahlen immer mit 2 Nachkommastellen dargestellt, berechnet werden. Also, bei 3,5 „Stunden” ist dann die Idee, daraus 3,50 (also 2‑stellige Nachkommazahl) zu generieren, die Ganzzahl und das Komma zu entfernen und die verbleibende Zahl 50 sind dann die Minuten. Wenn Sie unter diesem Aspekt die Tabelle hierüber betrachten, ist das Ganze hoffentlich etwas verständlicher.
Lösung per VBA
Dieses Ziel ließe sich recht gut mit einer UDF (benutzerdefinierten Funktion) lösen. Aber es gibt in vielen Unternehmen gute Gründe, Makros/VBA nicht zu ermöglichen. Für alle, die es probieren wollen hier ein möglichst transparenter Beispiel-Code:
Option Explicit Function RealZeit(Zelle As Range) As Date Dim Erfassung As Variant Dim Stunden As Variant, Minuten As Variant 'Datentyp Variant, um Variablen einzusparen (kaum Zeitverlust) Erfassung = Format(Zelle.Value, "0.00") Stunden = Int(Erfassung) Minuten = Split(CStr(Erfassung), ",") Minuten = Minuten(1) RealZeit = CDate(Stunden & ":" & Left(Minuten, 2)) End Function
Wie und wo Sie eine UDF erstellen und einfügen, können Sie hier nachlesen. Die Anwendung wäre dann beispielsweise so, dass Sie in B2 diese Formel schreiben: =RealZeit(A2)
und das Ergebnis dann als Zeit im gewünschten Format darstellen lassen. Diese Formel ziehen Sie dann so weit wie erforderlich nach unten. Und noch ein Hinweis: Wenn Sie diese UDF ernsthaft einsetzen wollen, dann sollten Sie noch für eine Fehlerbehandlung sorgen…
Lösung mit Formeln
Diese „Aufgabe” stammt im Grundsatz aus einem Forum. Und dort wurden auch einige Formeln vorgestellt, welche mehr oder weniger zielführend waren. Da sie allesamt nicht „auf meinem Mist gewachsen sind”, gehe ich auch nicht explizit darauf ein. Suchen Sie gerne im Netz, die Überschrift lautet „Zeiten richtig addieren” und der Thread wächst, und wächst … Ich habe zu Beginn der 2. Seite aufgehört, weiter mitzulesen und mich meiner, der hier vorgestellten Lösung gewidmet. 😎
Modern mit Power Query
Seit Excel 2010 ist Power Query ja als Add-In verfügbar bzw. beginnend mit der Version 2016 fest integriert. Hier brauchen Sie in den meisten Fällen keine Programmierkenntnisse, so gut wie immer ist alles mit einigen Mausklicks zu schaffen. Auch diese Aufgabe ließe sich nur mit „ohne eine einzige Formel” lösen, aber ich bin ausnahmsweise einmal der Überzeugung, dass der Aufwand über diesen Weg zu groß wäre. Es wären zu viele Schritte, welche die Transparenz bei eventuellen späteren Korrekturen enorm einschränken würden. Die 3 Formeln, welche Sie hier bei dem von mir vorgeschlagenen Weg eingeben werden, verschlanken das Projekt doch enorm. In erster Linie aber zählt aus meiner Betrachtungsweise, dass die Übersichtlichkeit erheblich besser gegeben ist; dennoch gilt ausnahmslos folgende Feststellung: Ich finde Aussagen wie „Der Code ist besser, weil er kürzer ist” einfach nur dumm. 👿
Beginnen Sie damit, dass Sie in einem Excel Arbeitsblatt beginnend in A1 und den folgenden Zeilen der Spalte A die Werte aus der Spalte Erfassung (siehe weiter oben) einschließlich der Überschrift eingeben. Ausnahmsweise gibt es hier einmal keine Muster-*.xlsx, denn die paar Zahlen in ein Tabellenblatt einzugeben stellt ja nun wirklich keinen großen Aufwand dar. Achten Sie darauf, dass eine beliebige Zelle innerhalb der Daten markiert ist und auf beliebige Weise daraus eine Intelligente Tabelle zu erstellen. Ich mache das meistens über StrgL. Anschließend vergebe ich im Feld Tabellenname: die Bezeichnung Arbeitszeiten:
Wählen Sie nun Daten | Aus Tabelle bzw. Power Query | Von Tabelle und die Liste bzw. Tabelle wird in den Power Query-Editor importiert:
Im rechten Seitenfenster ist der Name der Tabelle automatisch als Name für die Abfrage übernommen worden und darunter sind die ersten beiden aufgezeichneten Schritte des Imports (Angewendete Schritte) dargestellt:
Hier noch einmal der Hinweis, dass es auch ohne die Formeln geht… 😉 Wechseln Sie zum Register Spalte hinzufügen und im Menüband in der Gruppe Allgemein ein Klick auf Benutzerdefinierte Spalte. In das Textfeld Neuer Spaltenname geben Sie Stunden als die künftige Überschrift ein. Darunter in das große Textfeld Benutzerdefinierte Spaltenformel: geben Sie nach dem vorgegebenen Gleichheitszeichen diese Formel ein:
= Number.RoundDown([Erfassung], 0)
Achten Sie auf die Groß- Kleinschreibung, denn die Sprache M ist Case-sensitiv. Übrigens: Sie können jeden Spaltennamen, hier [Erfassung] ganz einfach durch einen Doppelklick auf den entsprechenden Namen im rechten Kasten übernehmen; die eckigen Klammern werden dann automatisch durch den Editor hinzugefügt. Nach einem OK wird die Spalte Stunden erzeugt und die Anzahl der ganzen Stunden wird berechnet. Ich denke dass Sie erkannt haben, dass dort das Äquivalent des Excel-ABRUNDEN() in der M‑Sprache angewendet wurde.
In den nächsten beiden Schritten sollen die Nachkommastellen so angepasst werden, dass bei einstelligen Darstellungen/Werten eine Null zugefügt wird und dadurch die real zu berechnenden Minuten erzeugt werden. Also aus 2,1 sollen 10 Minuten generiert werden. Anschließend werden Stunden und Minuten zu einer „korrekten” Zeit zusammengeführt.
Erstellen Sie wiederum eine Benutzerdefinierte Spalte und vergeben Sie den Spaltennamen Minuten. Als Spaltenformel tragen Sie ein:
= Int16.From(Number.Mod([Erfassung], 1) * 100)
Eine kurze Erklärung könnte hier hilfreich sein… In Excel wäre das in etwa die Funktion
REST(Erfassung; 1) * 100
Wie erwartet wird eine Spalte Minuten erzeugt und die berechneten Minuten werden dort als Zahl eingefügt. Und in der letzten Formel werden Sie dafür sorgen, dass aus Stunden und Minuten eine „echte” Zeit generiert wird. Natürlich ist das wieder der Weg über eine Benutzerdefinierte Spalte und folgende Formel ist zielführend, nachdem Sie als neuen Spaltennamen beispielsweise Reale Zeit eingegeben haben:
= Time.From(Text.From([Stunden]) & ":" & Text.From([Minuten]))
Das Ergebnis wird Sie vielleicht überzeugen, mich aber noch nicht ganz. Klicken Sie einmal in die Überschrift der letzten Spalte und schauen sich im Menüband des Registers Start den Datentyp an. Es ist Beliebig:
Auch wenn die Ausrichtung der Zeitangaben rechts ist und das Aussehen tatsächlich der typischen Zeitangabe entspricht, spätestens beim speichern als Tabelle (Schließen & laden) werden Sie sehen, dass dann ein korrekter numerischer Wert als serielle Zahl dargestellt wird aber keine (formatierte) Zeit. Und das müssten Sie dann bei Aktualisierungen wieder anpassen, was gewiss nicht so optimal ist. Darum ändern Sie hier in PQ vorzugsweise den Datentyp auf Zeit. In jedem Fall können Sie nun die beiden Spalten Stunden und Minuten löschen, indem Sie jeweils oder zusammenfassend in die Überschrift Klicken und dann beispielsweise Entf oder per Rechtsklick in die Überschrift und dann im Kontextmenü Spalten entfernen auswählen. Und wenn Sie ausschließlich die realen Zeiten behalten wollen, dann löschen Sie auch noch die Spalte Erfassung. Jetzt noch Start, Schließen & laden oder Datei, Schließen & laden in… und bestimmen Sie die Position, wo die Tabelle gespeichert werden soll. Natürlich können Sie auch die nach einem „normalen” Schließen & laden in einem neuen Blatt gespeicherte Tabelle komplett ausschneiden und an Ihrer Wunschposition platzieren.