簡體   English   中英

將 Excel 文本轉換為時間

[英]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:

  • 創建一個命名公式:
    • FormulasDefined NamesDefine NameNew Nameseq_99Refers 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)

算法:

  • 查找字符串hourminsec
  • 返回每個字符串之前的節點
  • 除以適當的因子以創建 excel 時間值

注意:自定義格式列 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 的主要優勢是幾乎任何事情都可以使用幾行額外的代碼來處理。 工作表函數沒有這種能力。

好吧,您可以接受並編輯它以滿足您的需要:

在此處輸入圖像描述

這是公式:

=IF(IFERROR(FIND("da",A2,1),0)>0,LEFT(A2,FIND(" ",A2,1)-1)*24,0)+IFERROR(1*MID(A2,FIND(" ",A2,FIND(" ",A2,1)+1),FIND(" ",A2,FIND(" ",A2,FIND(" ",A2,1)+1)+1)-FIND(" ",A2,FIND(" ",A2,1)+1)),0*1)

我只是想把日期轉換成小時,這樣你就可以完成你想要的。

如果您決定使用 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM