Clever-Excel-Forum

Normale Version: Zeit aus String extrahieren
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2
Hallo, ich habe ein Excel Dokument mit verschiedenen Zeitangaben in einem String Format:

16m 25s
02h 46m 26s
16h 12m 53s
1d 13h 31m 07s
13d 11h 07m 01s
usw.

Die Strings haben je nach Zeitangabe unterschiedliche Längen wie man sieht. 

daraus möchte ich jetzt in extra Spalten jeweils extrahieren: Tage, Stunden, Minuten, Sekunden.


Gibt es dafür einen eleganten Weg?
(Sheet im Anhang)
Hallöchen,

eine Möglichkeit wäre "Text in Spalten" wobei die Daten dann in unterschiedlichen Spalten stehen.
Falls Deine Version TEXTTEILEN kennt, im Prinzip mit
=TEXTTEILEN(A1;" ")
Vielen Dank für die schnelle Antwort!
Das ginge in der Tat recht einfach. Ich benötige aber einen Befehl, der in Excel Professional Plus 2021 funktioniert. Für "Textteilen" benötige ich Office 365 Inisder. 
Ich habe es versucht mit Daten --> Text in Spalten --> getrennt nach Leerzeichen
Dadurch wird aber der Rest meines Datensatzes ebenfalls zerstückelt (die Beispieltabelle aus meiner Frage ist nur ein kleiner Auszug daraus). Und dadurch, dass die Daten dann in unterschiedlichen Spalten stehen lässt sich damit schwer weiterrechnen. 

(Ich möchte als folgende Operationen mit den einzelnen Zeiten aus den Strings weiter rechnen, diese voneinander subtrahieren, mit Faktoren multiplizieren etc. Dafür möchte ich erst alle Zeitangaben in Sekunden umrechnen und das geht am einfachsten, wenn sie aufgeteilt nach Tagen / Stunden / Minuten / Sekunden in den jeweiligen Spalten aufgelistet sind)
Ergänze eine Zeile ganz oben, in der für jede Spalte der auszugebende Zeitwert benannt ist, also z. B. B1:=d, C1:=h usw.
Dann fügst du folgende Formel in B2 ein:
Code:
=WENNFEHLER(--TEIL($A2;FINDEN(B$1;$A2)-2;2);0)
Diese Formel kopierst du nach rechts und unten.
Hallöchen,

oder etwas anders:
=WENNFEHLER(WECHSELN(INDEX(TEXTTEILEN(A1;" ");1;VERGLEICH("*H";TEXTTEILEN(A1;" ");0));"h";"");"")
(ggf. mit -- erweitern)

Allerdings führen beide nicht zum Ziel wenn da weitere Texte drum herum stehen, z.B.
Was dem Kah Samstags um 16h 30m 15s geschah

Ich hab mal die Datei angeschaut, da stehen aber auch nur die Zeitangaben drin ...
B1[:B7]: =--WECHSELN(WECHSELN(WECHSELN(WECHSELN(A1;"h ";":");"m ";":");"s";);"d";".1.1900") bis maximal 31d

Damit hast Du die Excel-DatumZeit. Und daraus ziehst Du dann Spalten mit KÜRZEN, STUNDE, MINUTE, SEKUNDE.
______________
B1[:E7]: =--TEIL(TEXT(WECHSELN(WECHSELN(WECHSELN(WECHSELN($A1;"h ";":");"m ";":");"s";);"d";".1.1900");"TT hh:mm:ss");SPALTE(A1)*3-2;2)

erledigt das auch gleich in einem Zug.
Vielen Dank für die vielen Vorschläge!

"B1[:B7]:" bedeutet, dass ich den Befehl in Zelle B1 eintrage und dann nach unten bis B7 ziehe, richtig?


[:B7
Ich habe den blau markierten Teil aus dem letzten Beitrag in meine Zelle B1 kopiert, dann mit Enter bestätigt. Bekomme dann aber einen Fehler:

[attachment=50090]
Hallo Lupo,

(27.11.2023, 09:09)LCohen schrieb: [ -> ]B1[:B7]: =--WECHSELN(WECHSELN(WECHSELN(WECHSELN(A1;"h ";":");"m ";":");"s";);"d";".1.1900")
Diese Formel liefert falsche Ergebnisse, wenn z.B. die Stunden fehlen, z. B. wird "16m 25s" zu "16:25:00", also zu 16 Stunden. Bei der zweiten Formel besteht dieses Problem übrigens auch, da das gleiche Prinzip verwendet wird.
UDF:

Code:
Function F_snb(c00)
  sn = Split(IIf(InStr(c00, "h") = 0, "h ", "") & IIf(InStr(c00, "m") = 0, "m ", "") & IIf(InStr(c00, "s") = 0, "s ", "") & c00)
  F_snb = TimeSerial(Val(Filter(sn, "h")(0)), Val(Filter(sn, "m")(0)), Val(Filter(sn, "s")(0)))
End Function

oder

Code:
Function F_snb(c00)
   F_snb = Evaluate(Replace(Replace(Replace(Replace(Replace(c00, "h", "/24"), "d", ""), "m", "/1440"), "s", "/86400"), " ", "+"))
End Function


NB. wenn Tag erscheint geht es um Zeitdauer nicht om UhrZeit.
Hallo

da war snb mit seinen berühmten Einzeilern schneller, trotzdem zeige ich auch mal meine Lösung.
Altmodisch, aber er funktioniert.

mfg Gast 123

Code:
Sub Zeiten_aufteilen()
Dim AC As Range, lz1 As Long
lz1 = Cells(Rows.Count, 1).End(xlUp).Row
For Each AC In Range("A1:A" & lz1)
    If InStr(AC, "s") Then AC.Offset(0, 4) = Replace(Right(AC, 3), "s", "")
    If InStr(AC, "m") Then AC.Offset(0, 3) = Mid(AC, InStr(AC, "m") - 2, 2)
    If InStr(AC, "h") Then AC.Offset(0, 2) = Mid(AC, InStr(AC, "h") - 2, 2)
    If InStr(AC, "d") Then AC.Offset(0, 1) = Replace(Left(AC, 3), "d", "")
Next AC
End Sub
Seiten: 1 2