[英]Convert Excel Text to Time
我必須將一些格式化文本轉換為 excel 時間,但我自己找不到解決方案。
以下是輸入文本的一些示例以及應如何轉換:
- 1 Hour 14 minutes ==> 01:14:00
- 1 minute. ==> 00:01:00
- 1 Hour 1 minute ==> 01:01:00
- 2 minutes ==> 00:02:00
- 3 minutes 12 seconds ==> 00:03:12
- 29 seconds ==> 00:00:29
請注意,有些時候分和秒都有,而有些時候只有分/秒之一,除了有些時候你會找到分鍾(復數),而有些時候只有分鍾(單數)。 最后,一些標點符號有時會出現在文本中。
數據在電子表格列中,我想在電子表格的不同列中提取 excel 格式化時間。
我在單元格公式中嘗試了不同版本的TimeValue()
和DateValue()
以及一些嵌套的 replace(),但它們都不適用於所有情況。
你能給我一個關於如何解決這個問題的想法或一些建議嗎?
謝謝,
保羅
由於您沒有包含 VBA 作為標簽,這里有一些公式解決方案。
如果您有 Windows Excel 2013+ 和FILTERXML
function,您可以使用以下內容:
=IFERROR(FILTERXML("<t><s>" & SUBSTITUTE(LOWER(A1)," ","</s><s>") & "</s></t>","//s[contains(.,'hour')]/preceding-sibling::*[1]")/24,0)+
IFERROR(FILTERXML("<t><s>" & SUBSTITUTE(LOWER(A1)," ","</s><s>") & "</s></t>","//s[contains(.,'min')]/preceding-sibling::*[1]")/1440,0)+
IFERROR(FILTERXML("<t><s>" & SUBSTITUTE(LOWER(A1)," ","</s><s>") & "</s></t>","//s[contains(.,'sec')]/preceding-sibling::*[1]")/86400,0)
如果您沒有FILTERXML
function:
Formulas
→ Defined Names
→ Define Name
→ New Name
→ seq_99 → Refers to:
→ =IF(ROW(INDEX($A:$A,1,1):INDEX($A:$A,255,1))=1,1,(ROW(INDEX($A:$A,1,1):INDEX($A:$A,255,1))-1)*99)
然后使用這個公式:
=IFERROR(INDEX(TRIM(MID(SUBSTITUTE(TRIM(A1)," ",REPT(" ",99)),seq_99,99)),-1+MATCH("hour*",TRIM(MID(SUBSTITUTE(TRIM(A1)," ",REPT(" ",99)),seq_99,99)),0))/24,0)+
IFERROR(INDEX(TRIM(MID(SUBSTITUTE(TRIM(A1)," ",REPT(" ",99)),seq_99,99)),-1+MATCH("min*",TRIM(MID(SUBSTITUTE(TRIM(A1)," ",REPT(" ",99)),seq_99,99)),0))/1440,0)+
IFERROR(INDEX(TRIM(MID(SUBSTITUTE(TRIM(A1)," ",REPT(" ",99)),seq_99,99)),-1+MATCH("sec*",TRIM(MID(SUBSTITUTE(TRIM(A1)," ",REPT(" ",99)),seq_99,99)),0))/86400,0)
算法:
hour
或min
或sec
注意:自定義格式列 B 為hh:mm:yy
正如@ScottCraner 在評論中指出的那樣,可以通過創建數組公式來縮短公式:
使用FILTERXML
:
=SUM(IFERROR(FILTERXML("<t><s>" & SUBSTITUTE(LOWER(A1)," ","</s><s>") & "</s></t>","//s[contains(.,"&{"'hour'","'min'","'sec'"}&")]/preceding-sibling::*[1]")/{24,1440,8640},0))
沒有FILTERXML
:
=SUM(IFERROR(INDEX(TRIM(MID(SUBSTITUTE(TRIM(A1)," ",REPT(" ",99)),seq_99,99)),-1+MATCH({"hour*","min*","sec*"},TRIM(MID(SUBSTITUTE(TRIM(A1)," ",REPT(" ",99)),seq_99,99)),0))/{24,1440,8640},0))
在 Excel 的一些早期版本中,您可能需要通過按住ctrl + shift的同時按enter來“確認”這個數組公式。 如果您正確執行此操作,Excel 將在公式周圍放置大括號{...}
,如公式欄中所示
我玩了你的問題一天,看到其他人也做了同樣的事情。 我很佩服 Ron Rosenfeld 提供的使用 FilterXML 的解決方案,我曾簡單地認為它過於古怪而放棄了。 它不是。 但它並不整潔。 對於“整潔”,請看下面的 UDF。 從工作表中使用=TextToTime(A1)
之類的內容調用它,並確保將您放入的單元格格式化為時間,可能類似於hh:mm:ss
。
Function TextToTime(Cell As Range) As Double
Dim Fun(2) As String
Dim Txt() As String
Dim Tmp As Variant
Dim i As Integer
Txt = Split(Cell.Value)
For i = 1 To UBound(Txt)
If Not IsNumeric(Txt(i)) Then
Tmp = 0
Tmp = InStr("HMS", UCase(Left(Trim(Txt(i)), 1)))
If Tmp Then
Fun(Tmp - 1) = Val(Txt(i - 1))
End If
End If
Next i
For i = LBound(Fun) To UBound(Fun)
If Fun(i) = "" Then Fun(i) = 0
Next i
TextToTime = TimeValue(Join(Fun, ":"))
End Function
這款 function 用途廣泛。 它可以翻譯諸如“5 小時 10 分 15 秒”或“5 小時 10 分 15 秒”(帶逗號)甚至“5 小時 10 分 15 秒”之類的字符串。 它需要數字周圍的空格,但不會因多余的空格或拼寫錯誤而猶豫。 它在“75 分 66 秒”時失敗,但如果這是一個問題,可以處理。 VBA 的主要優勢是幾乎任何事情都可以使用幾行額外的代碼來處理。 工作表函數沒有這種能力。
如果您決定使用 VBA 並且在 A 列中保持相同的格式,則可以使用以下代碼:
代碼:
Sub Converter()
Dim i As Long, y As Long, LastRow As Long
Dim arrData As Variant, arrLine As Variant
Dim Hours As String, Minutes As String, Seconds As String
With ThisWorkbook.Worksheets("Sheet1")
LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row
arrData = .Range("A1:A" & LastRow)
For i = LBound(arrData) To UBound(arrData)
Hours = "00"
Minutes = "00"
Seconds = "00"
arrLine = Split(arrData(i, 1), " ")
For y = LBound(arrLine) To UBound(arrLine)
If InStr(1, UCase(arrLine(y)), "HOUR") > 0 Then
Hours = Right("0" & arrLine(y - 1), 2)
ElseIf InStr(1, UCase(arrLine(y)), "MINUTE") > 0 Then
Minutes = Right("0" & arrLine(y - 1), 2)
ElseIf InStr(1, UCase(arrLine(y)), "SECOND") > 0 Then
Seconds = Right("0" & arrLine(y - 1), 2)
End If
Next y
.Range("B" & i).Value = Hours & ":" & Minutes & ":" & Seconds
Next i
End With
End Sub
Output:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.