3

我有一个 Excel 表格,其中的时间格式如下例所示。我需要将时间从文本字符串转换为可用格式。如果我能在几秒钟内以相同的格式获取所有内容并从那里开始工作,我会很高兴。我知道我可以使用辅助列和一个很长的丑陋的 IF 左、右、中间公式来做到这一点,然后除以所有内容,但我每天都在处理数千个这样的问题,并且希望使用动态公式或 VBscript 更好地自动化它,使这些更容易使用。

     A         B
1 Server(A)  15d 3h 39m
2 Server(E)  3h 36m 44s
3 Server(C)  4m 3s
4 Server(B)  44s
4

2 回答 2

1

这并不优雅,但只要您的格式符合描述,它就可以作为 UDF 工作:

Public Function timeStringToSeconds(strIn As String) As Long
    Dim values
    values = Split(strIn, " ")
    For Each v In values
        Select Case Right$(v, 1)
            Case "d"
                timeStringToSeconds = timeStringToSeconds + CLng(Left$(v, Len(v) - 1)) * 86400
            Case "h"
                timeStringToSeconds = timeStringToSeconds + CLng(Left$(v, Len(v) - 1)) * 3600
            Case "m"
                timeStringToSeconds = timeStringToSeconds + CLng(Left$(v, Len(v) - 1)) * 60
            Case "s"
                timeStringToSeconds = timeStringToSeconds + CLng(Left$(v, Len(v) - 1))
        End Select
    Next
End Function

您可以简单地通过这样做来使用它:例如在 C1 中:timeStringToSeconds(B1) 或者通过执行以下操作在一个范围内运行它: range.value = timeStringToSeconds(range.value)

于 2012-12-14T19:29:22.267 回答
0

另一种将字符串转换为可用格式的方法,如 dd:hh:mm:ss。当然,如果您只需要几秒钟,我们也可以即兴发挥;)

试用后请发表评论。我将这种情况称为多分隔符拆分组合:) 我们将d, h, m, s其视为分隔符。也可以使用split函数和regexp

dd:hh:mm:ss

代码:

Function multiSplitCombine(ByVal strTime As String) As String
Dim delimsArray(0 To 3) As Variant
Dim i As Long, j As Long, k As Long

    'set delimiters
    delimsArray(0) = "d"
    delimsArray(1) = "h"
    delimsArray(2) = "m"
    delimsArray(3) = "s"

    If Len(strTime) = 0 Then
        multiSplitCombine = "00:00:00:00"
        Exit Function
    End If

    For i = LBound(delimsArray) To UBound(delimsArray)
        '-- get the position of the delimiter
        j = InStr(1, strTime, delimsArray(i))

        '-- if the delimiter is not found
        If j = 0 Then
            '-- insert 00: into the position after earlier previous delimiter replacement
            strTime = Left(strTime, k) & "00:" & Right(strTime, Len(strTime) - k)
        Else
            k = j
           '-- replace delimiter with semicolon
            strTime = Replace(strTime, delimsArray(i), ":")
        End If
    Next i

    '-- strip that last extra semi colon
    strTime = Trim(Left(strTime, Len(strTime) - 1))

    '-- remove internal white spaces
    strTime = Replace(strTime, " ", "")

    '-- back to sheet
    multiSplitCombine = Application.WorksheetFunction.Text(strTime, "dd:hh:mm:ss")
End Function

片刻之间

这是您需要在上面的代码中更改的内容,

  • 将函数名称更改为splitToSeconds
  • strTime = Replace(strTime," ", "")通过添加以下代码替换所有内容

    '-- dd:hh:mm:ss format
    strTime = Application.WorksheetFunction.Text(strTime, "dd:hh:mm:ss")    
    
    '-- split by semicolon
    s = Split(strTime, ":")
    
    '-- it has to be 4 elements since the format we insert is d:h:m:s
    splitToSeconds = CDbl(s(0)) * 24 * 60 * 60 + _ 
                     CDbl(s(1)) * 60 * 60 + CDbl(s(2)) * 60 + CDbl(s(3))
    

输出:

在此处输入图像描述

于 2012-12-14T22:34:33.487 回答