Importierte Zeit-Werte ohne Doppelpunkt

Importierte Zeit-Werte sind ohne Doppelpunkt oder andere Trenner → zu hh:mm:ss,nnn

Mitunter kommt es vor, dass beim Import von Dat­en die Zei­tangaben ohne Tren­ner sind, es fehlt der Dop­pelpunkt. Manche Sen­soren senden solch eige­nar­tige Werte als Pro­tokoll. Fast immer sind das auch numerische Werte, wo dann bei Stun­den bis 9:59:59h die führende Null natür­lich nicht mit über­tra­gen oder seit­ens Excel abgeschnit­ten wird. Als erschw­erend kann dann noch hinzu kom­men, dass hun­dert­s­tel Sekun­den mit angegeben wer­den, die teil­weise mit einem Punkt, teil­weise mit einem Kom­ma separi­ert wer­den.

Um so etwas in ein „vernün­ftiges” For­mat zu bekom­men, bieten sich mehrere Wege an. Wenn es nur um die Optik geht, dann reicht ein anderes Zahlen­for­mat aus. Soll mit den Werten auch gerech­net wer­den, dann soll­ten dort auch „echte” Zei­tangaben ste­hen. In den Beispie­len wird (des möglichen „worst case” wegen) immer davon aus­ge­gan­gen, dass Zeit­en vor 10:00h mit ein­stel­liger Stun­de­nangabe nach dem Import in Excel ste­hen: 91020.30 bzw. 91020,30 wäre also 9 Uhr 10 Minuten 20 Sekun­den und 30 hun­dert­s­tel Sekun­den.

Prinzip­iell machen auch noch die hun­dert­s­tel Sekun­den bei der „nor­malen” Umwand­lung in echte Zeit-Werte Prob­leme, darum wer­den hier auch bei­de Wege aufgezeigt: Mit und ohne Berück­sich­ti­gung der Sekun­den­bruchteile.

▲ nach oben …

Nur das Zahlenformat anpassen

Aus­gangslage: 91020,3 in Zelle A1. Die erste Idee, die vie­len Usern gewiss kommt: =TEXT(A1;"h:mm:ss"). Nur das Ergeb­nis ist gewiss entsch­ieden anders, als erwartet, pro­bieren Sie es gerne sel­ber aus.

Nach dem Fehlver­such soll es ein Mal in ganz kleinen Schrit­ten voran gehen. Und das erste Ergeb­nis soll ohne die Sekun­den­bruchteile sein. Dazu müssen Sie erst ein­mal eventuelle Nachkom­mas­tellen ent­fer­nen, das geht mit der Funk­tion  GANZZAHL(). Zumin­d­est dann, denn der Dez­i­mal­tren­ner genau dem entspricht, den Excel auf Ihrem Sys­tem ver­wen­det. Mit anderen Worten: Wenn Sie ein Kom­ma als Dez­i­mal­tren­ner ver­wen­den, dann muss der importierte Wert die hun­dert­s­tel Sekun­den auch mit einem Kom­ma separi­eren. Falls dort ein Punkt ste­ht, muss dieser erset­zt wer­den (beispiel­sweise durch StrgH). Es gibt auch andere Möglichkeit­en, das aber würde hier zu weit führen.

Abhängig von der Zeit bleiben nun 5 oder 6 Stellen/Ziffern über. Da sollen nun die Dop­pelpunk­te geset­zt wer­den. Das ließe sich mit ein­er WENN()-Funk­tion machen, denn entwed­er ist der linke Dop­pelpunkt nach der ersten oder nach der zweit­en Zif­fer. Ich ziehe es vor, die Zeit in jedem Fall 6‑stellig darzustellen. Darum sieht meine Formel im ersten Schritt so aus: =GANZZAHL(A1)
Es wird schlicht und ein­fach der Nachkom­ma-Anteil abgeschnit­ten. Jet­zt bleibt eigentlich nur noch, das Zahlen­for­mat anzu­passen. Als benutzerdefiniertes Zahlen­for­mat gebe ich fol­gen­des in das entsprechende Feld ein: 00":"00"."00 und das Ergeb­nis sieht genau so aus, wie ich es haben möchte. Aber Vor­sicht, es ist immer noch die Zahl 91.020 (hier mit Tausendertren­ner dargestellt), die sich hin­ter dem Wert ver­birgt. Wenn Sie mit dieser schein­baren Zei­tangabe rech­nen, geht das richtig schief!

Wenn Sie das Ganze mit den Sekun­den­bruchteilen darstellen wollen, dann ist das prinzip­iell noch ein­fach­er: Ohne Umwand­lung, nur das Zahlen­for­mat ändern: 00":"00":"00,00. Auch hier gilt natür­lich, dass das Erschei­n­ungs­bild „lügt”, weil ein ganz ander­er Wert dahin­ter steckt.

Sind die hun­dert­s­tel Sekun­den mit einem Punkt abge­tren­nt, dann ist es am ein­fach­sten, als ersten Schritt in der Spalte den Punkt durch ein Kom­ma zu erset­zen. Der Rest ist dann wie hierüber beschrieben, weil durch den Aus­tausch eine Zahl nach europäis­ch­er Norm daraus wird. Das ist ja weit­er oben schon angeschnit­ten wor­den.

▲ nach oben …

In „echte” Zeitangaben konvertieren

Wollen oder müssen Sie mit den Werten weit­er rech­nen oder soll auf der Basis ein Dia­gramm erstellt wer­den, dann ist es unbe­d­ingt erforder­lich, „echte” Zeit­en daraus zu machen. Sie wis­sen wahrschein­lich, dass Zeit­en immer der Bruchteil eines Tages sind und durch Excel nur anders dargestellt wer­den. Sie sehen 12:00, Excel rechtet mit 0,5  weil diese Zei­tangabe genau die Hälfte des Tages wieder­spiegelt. Etwas mehr dazu kön­nen Sie hier im Blog nach­le­sen.

▲ nach oben …

Funktion ZEIT()

Die ein­fach­ste Lösung ist schon fast banal zu nen­nen. Sie baut auf Zahlen­for­mat hierüber auf, bringt aber den­noch eine Uhrzeit zus­tande, mit der Excel rech­nen kann. Im ersten Denkansatz mache ich aus dem Uhrzeit-Text einen Text in einem stan­dar­d­isierten For­mat: =TEXT(GANZZAHL(A1); „000000”). Davon kann ich nun mit den Text­funk­tio­nen LINKS(), TEIL() und RECHTS() die Stun­den, Minuten und Sekun­den extrahieren. Die Formel würde dann so laut­en:
=ZEIT(LINKS(TEXT(GANZZAHL(A1); "000000"); 2); TEIL(TEXT(GANZZAHL(A1); "000000"); 3; 2); RECHTS(GANZZAHL(A1); 2))
(Die Formel gehört natür­lich in 1 Zeile!) Ach ja, wahrschein­lich wer­den Sie das Zahlen­for­mat von AM/PM auf europäis­che Norm ändern.

▲ nach oben …

Funktion ZEITWERT()

Wenn Sie die Formel eben als lang emp­fun­den haben, dann sehen Sie sich ein­mal die Alter­na­tive an. Hier wird die Zahl der importierten Zei­tangabe in eine Text umge­wan­delt, der eine les­bare Zei­tangabe in kor­rek­tem For­mat enthält. Und das ist nicht nur eine andere Ansicht, die Dop­pelpunk­te ste­hen dort tat­säch­lich drin­nen. Und die Funk­tion wan­delt dann den Text in eine kor­rek­te Zeit um. Hier nun die Formel, die natür­lich auch in eine einzige Zeile eingegeben wird:
=ZEITWERT(WENN(LÄNGE(GANZZAHL(A1))=5; LINKS(A1; 1) & ":" & TEIL(A1; 2; 2); LINKS(A1; 2) & ":" & TEIL(A1; 3; 2)) & ":" & RECHTS(GANZZAHL(A1); 2))

Hier wird übri­gens stets eine serielle Zahl zurück­gegeben, die wer­den Sie in jedem Fall als Zeit for­matieren müssen, wenn Sie eine Uhrzeit sehen wollen.

▲ nach oben …

Mit VBA

Per Makro, also mit VBA geht das alles sehr direkt und sog­ar auch in der gle­ichen Spalte. Mit anderen Worten: Es bedarf kein­er Hil­f­ss­palte, die Werte wer­den gle­ich in eine Zei­tangabe umge­wan­delt. Dieses Makro ist so aus­gelegt, dass Sie den anzu­passenden Bere­ich markieren und dann den VBA-Code beispiel­sweise per AltF8 oder über eine Schalt­fläche starten:

Option Explicit

Sub EchteZeiten()
   Dim rng As Range, c As Range
   Dim rescue As Variant, Wert As Variant, Wert2 As String
   Set rng = Selection
   For Each c In rng
      rescue = c
      c.Replace What:=".", Replacement:=","
      If IsNumeric(c) Then
         Wert = CStr(CLng(c))
         If Len(Wert) > 4 Then
            Wert2 = Right("0" & Format(Wert, "000000"), 6)
            Wert2 = (Left(Wert2, 2) & ":" & Mid(Wert2, 3, 2) & ":" & Right(Wert2, 2))
            If IsDate(TimeValue(Wert2)) Then
               c = CDate(Wert2)
               c.NumberFormat = "HH:MM:SS"
            Else
               Call Fehlermarkierung(c, rescue)
            End If
         Else
            Call Fehlermarkierung(c, rescue)
         End If
      End If
   Next c
End Sub

Sub Fehlermarkierung(c As Range, rescue As Variant)
   c = rescue
   c.Interior.Color = RGB(255, 255, 0)
End Sub

▲ nach oben …

Mit Hilfe von Power Query

Pow­er Query ist ein Add-In für Win­dows-Excel, welch­es ab Excel 2010 einge­set­zt wer­den kann. Ab der 2016er-Ver­sion ist es fest in Excel (Win­dows) einge­bun­den. Mehr dazu kön­nen Sie gerne hier im Blog nach­le­sen. Die Stärke dieses Tools liegt darin, dass Sie vieles damit durch­führen kön­nen, ohne pro­gram­mieren zu müssen. Und ein weit­er­er Vorteil ist, dass jed­er Schritt solch eines Daten­im­ports aufgeze­ich­net wird und bei aktu­al­isiert­er Daten­lage mit weni­gen Klicks zu wiederum aktuellen Ergeb­nis­sen führt.

Hin­weis: Der gesamte Abschnitt ist keine Anleitung zum The­ma Pow­er Query. Sie kön­nen aber anhand der aufgeze­ich­neten Dat­en gewiss nachvol­lziehen, was dort in einzel­nen Schrit­ten passiert ist. Zugegeben, das kostet Konzen­tra­tion und Sie brauchen ein gewiss­es Maß an Abstrak­tionsver­mö­gen … Ide­al­er­weise sehen Sie es als Ini­tialzün­dung, PQ auch bei eige­nen Pro­jek­ten kün­ftig einzuset­zen. Und im Zweifel schreiben Sie uns eine E‑Mail, wir leit­en Ihre Anfrage dann gerne an unseren Spon­sor GMG-CC weit­er. Bis dahin ist alles kosten­los und unverbindlich.

Um das Ganze etwas nachvol­lziehen zu kön­nen, laden Sie bitte diese zip-Datei herunter. Dort sind 2 Files enthal­ten: ImportData.csv und Importierte Zeitwerte ohne Trenner.xlsx. Falls Sie für eigene Trainigsläufe die csv-Datei ver­wen­den wollen, dann soll­ten Sie diese nicht per Dop­pelk­lick öff­nen son­dern beispiel­sweise entwed­er per copy/paste in ein Blatt ein­fü­gen oder über das Dat­en-Menü Externe Dat­en abrufen | Aus Text (!) importieren. Aber Vor­sicht, diese Möglichkeit birgt Gefahren. Der ursprüngliche Wert 183920.143 wird unter Umstän­den zu 183.920.143; also eine Dez­i­malzahl (der Punkt ist hier der Dez­i­mal­tren­ner) wird zu ein­er riesi­gen Ganz­zahl, weil Excel den Punkt als Tausender-Tren­ner inter­pretiert. Hier wäre dann ein direk­ter Import durch Pow­er Query hil­fre­ich­er. – In der Excel-Datei sind die Dat­en schon enthal­ten. Außer­dem wurde noch ein Über­schrift einge­fügt, weil eine Liste bzw. Intel­li­gente Tabelle eine Über­schrift in jed­er Spalte braucht.

Im Tabel­len­blatt Import sind nun diese (kor­rek­ten) Dat­en enthal­ten. Was in der Prax­is (hof­fentlich) nie passiert ist hier in pro­vokan­ter Weise manip­uliert wor­den: Teil­weise ist ein Punkt der Dez­i­mal­tren­ner, teil­weise das Kom­ma. So etwas ist schon möglich, wenn die Dat­en per Hand eingegeben wor­den sind. Und in der let­zten Zeile ste­ht ein Wert, der nie und nim­mer eine Zeit darstellen kön­nte. „Fak­tor Men­sch”, eben. Darum dieses exo­tisch anmu­tende Beispiel.

Wie schon erwäh­nt, das Ganze soll Ihnen etwas Appetit auf Pow­er Query machen. In einzel­nen Schrit­ten zeige ich Ihnen auf, welche Ergeb­nisse mit (meist) ein­fachen Mit­teln möglich sind. Sehr kurze, stich­wor­tar­tige Hin­weise zu den einzel­nen Arbeits­blät­tern „gönne” ich Ihnen den­noch. 🙂 

▲ nach oben …

Lösung 1

Die Ergeb­nisse hier sind auf hh:mm:ss begren­zt, die Sekun­den­bruchteile wer­den nicht abgeschnit­ten son­dern die Sekun­den wer­den auf null Stellen gerun­det. Abschnei­den wäre natür­lich auch möglich. Das gilt übri­gens auch für die näch­ste Lösung. – In PQ wor­den die Dat­en erst in Text umge­wan­delt, damit sie genau so ver­ar­beit­et wer­den kön­nen, wie sie im Orig­i­nal sind. Dann sind die Punk­te durch Kom­mas erset­zt wor­den und anschließend habe ich den Daten­typ Ganz­zahl gewählt, um die Sekun­den zu run­den.

Im näch­sten Schritt teile ich die erste Spalte nach jew­eils 2 Zeichen von rechts aus gese­hen. Diesen Vor­gang wieder­hole ich noch ein­mal, wom­it ins­ge­samt 3 Spal­ten ent­standen sind. Umbe­nen­nen der Spal­ten und den Abfrage-Edi­tor schließen (und die Dat­en natür­lich in ein neues Tabel­len­blatt laden, was automa­tisch geschieht).

Im neuen, eben erstell­ten Tabel­len­blatt (gle­ich umbe­nan­nt) habe ich dann noch die Über­schrift in Spalte D geschrieben und in D2 die Funk­tion einge­fügt, um aus den drei Einzel­w­erten eine „echte” Zeit zu machen. Natür­lich habe ich auch noch das Zahlen­for­mat angepasst. Aber: Spätestens hier erken­nen Sie, dass auch solch ein „Unsinn” wie in der let­zten Zeile brav umge­wan­delt wird. Dann sind es eben 1122 Stun­den …

▲ nach oben …

Lösung 2

Die erste Lösung hat einen großen Vorteil: Sie brauchen nur zu Klick­en, um zum Ergeb­nis zu kom­men. Und natür­lich müssen Sie den Weg zum Ziel ken­nen, aber das ist generell ja eine Vorbe­din­gung. Aber es gibt auch einen kleinen Nachteil, vielle­icht sog­ar zwei: Die Quell­dat­en müssen in ein­er Liste ste­hen, damit eine Aktu­al­isierung klappt. Und wenn Dat­en in der Quell­datei ange­fügt wer­den, der Import also mehr Zeilen hat als der vorherige, dann müssen die überzäh­li­gen Zeilen in Spalte D auch als Zeit for­matiert wer­den. Das hört sich vielle­icht kom­pliziert an, aber pro­bieren Sie gerne ein­mal, im Blatt Dat­en ein oder zwei „Text-Zeit­en” anzufü­gen. Dann wis­sen Sie rasch, was ich meine.

Möcht­en Sie das ver­mei­den, dann bedarf es in PQ ein­er Zeile Code. Eigentlich ist es nur ein State­ment, welch­es mit­tels ein­er Funk­tion die einzel­nen Spal­ten ver­ket­tet und stets das gle­iche Trennze­ichen, hier ein Dop­pelpunkt dazwis­chen set­zt. Der Start ist wie in der ersten Ver­sion. – Das Ergeb­nis ist dann ein Text, der das Ausse­hen ein­er Uhrzeit hat. Mit einem einzi­gen Klick den Daten­typ auf Zeit ändern und Sie kön­nen die Abfrage schließen. Spätestens in dem neu erstell­ten Arbeits­blatt wer­den Sie erken­nen, dass die let­zte Daten­zeile zwar die Einzel­w­erte der Zeit enthält, wegen der über­mäßig vie­len Stun­den wird im Feld Uhrzeit aber nichts angezeigt. Und: Sie brauchen die Uhrzeit im Ergeb­nis-Blatt nicht zu for­matieren, wenn Sie das typ­is­che 24-Stun­den-For­mat ver­wen­den wollen.

▲ nach oben …

Lösung 3

Auf­bauend auf Lösung 2 wird hier ein ähn­lich­er Weg beschrit­ten. Zu Beginn wird aber nach der Umwand­lung der Punk­te zu Kom­mas die Ganz­zahl dadurch erzeugt, dass der Text an der Stelle des Kom­mas ges­plit­tet, geteilt wird. Dadurch wird der Nachkom­ma-Anteil in eine geson­derte Spalte geschrieben. Durch zwei Verknüp­fungs-Vorgänge wer­den die einzel­nen Teile dann zu einem Text zusam­menge­fügt. – In der erzeugten Tabelle wird dann noch das Zahlen­for­mat mit ein­er benutzerdefinierten For­matierung angepasst.

Epilog

Für alle Meth­o­d­en per Pow­er Query gilt, dass Sie in PQ prob­lem­los die nicht mehr benötigten Spal­ten löschen kön­nen. Das Ergeb­nis wird dadurch nicht beein­trächtigt. – Für die Eingabe per Hand in Tabel­len­blät­ter ohne Trennze­ichen gibt es beispiel­sweise hier Hin­weise.

[NachOben­Let­zte Verweis=„ML: Zeitwerte ohne Dop­pelpunk­te mit PQ”]
Dieser Beitrag wurde unter Daten-Import / -Export, Datum und Zeit, Formatierung, Mit VBA/Makro, Ohne Makro/VBA, Power Query abgelegt und mit , , , , , verschlagwortet. Setze ein Lesezeichen auf den Permalink.