Answered

Zeitdauer in Berichten zur Weiterverwendung in Excel

  • 26 March 2024
  • 1 Antwort
  • 29 Aufrufe

Hallo Community,

wir exportieren Daten über individuelle Berichte aus Personio, um in Excel weitergehende Auswertungen zu erstellen. Die Berichte werden als xlsx gespeichert und nicht weiter bearbeitet. Die Auswertung erfolgt in einer separaten Excel-Datei, die mittels PowerQuery die Daten aus den Personio-Berichten zieht.

 

In den Personio-Berichten sind Zeitdauer-Werte enthalten, in unserem Fall handelt es sich um monatliche Arbeitsstunden.

In der Exportdatei stehen die Daten als Zahlwerte (z.B. 7,08333). Der Screenshot zeigt die Daten als Zahl bzw. Datetime Formatierung.

ursprüngliche Daten aus Bericht

 

Wenn jedoch die Export-Datei geöffnet & gespeichert wurde (es müssen keine Daten verändert werden) wechselt Excel die Formatierung der Daten in der Datei intern auf eine DateTime-Formatierung. In der Exportdatei stehen die Daten nun als DateTime (z.B. 07.01.1900 02:00).

Bericht wurde in Excel überspeichert

PowerQuery hat nun das Problem, dass es nicht zwischen Zahlwerte und DateTime unterscheiden kann. Beim Konvertieren führen die unterschiedlichen Datentypen dazu, dass alle Zeitdauern um 24h zu hoch angegeben werden, wenn die Exportdatei zuvor aus Excel heraus gespeichert wurde.

 

Ist anderen Usern das Problem auch aufgefallen? Wie habt ihr es lösen können? Hinweise wie “bitte die Exportdatei nicht öffnen und speichern” sind zwar gut gemeint, aber führen in der Praxis dennoch zu gravierenden Fehlern.

icon

Beste Antwort von Christoph P. 9 April 2024, 11:12

Zum Originalpost

1 Antwort

Habe mittlerweile einen Workaround gefunden. Hier die Lösung für die Nachwelt:

mit folgender Funktion direkt nach dem Import der Daten (bevor PowerQuery den Spalten Datentypen zuweist) die Daten manuell konvertieren.

Die Funktion prüft, ob der Datentyp “datetime” ist. Falls ja, wandele es in number um und subtrahiere 1. Andernfalls handelt es sich um Datentyp “number”.

= Table.ReplaceValue(#"Höher gestufte Header",each [Tatsächliches Arbeitsstundensoll],each if Value.Is([Tatsächliches Arbeitsstundensoll], type datetime) then Number.From([Tatsächliches Arbeitsstundensoll])-1 else [Tatsächliches Arbeitsstundensoll],Replacer.ReplaceValue,{"Tatsächliches Arbeitsstundensoll"})

 

Mit der Funktion die benötigten Spalten (tats. Arbeitsstundensoll, Arbeitsstunden (bestätigt), ...) nacheinander verarbeiten. Anschließend in Datentyp duration konvertieren.

Deine Antwort