VBA TimeValue()和电子表格公式TimeValue()

时间:2015-07-01 15:47:29

标签: excel vba excel-vba

早上好,

我在6/23/2015 1:05:37.7 PM这样的列中有超过20,000个时间输入,需要在Excel可以管理的时间值内进行传输。

我设法找到了解决方法:

Set wrTB = Worksheets("TEST BENCH Data")
wrTB.UsedRange
lastRowTB = wrTB.UsedRange.Rows.Count
lastColumnTB = wrTB.UsedRange.Columns.Count

If lastRowTB > 1 Then 'makes sure there is data on the worksheet
    If wrTB.Cells(7, lastColumnTB) <> "" Then 'makes sure time has not already been formated
        Dim aTempsTB As Variant, TempsTB() As String
        ReDim TempsTB(lastRowTB - 7, 1)
        aTempsTB = wrTB.Range(wrTB.Cells(8, 2), wrTB.Cells(lastRowTB, 2))
        For i = 1 To lastRowTB - 7
            TempsTB(i - 1, 0) = Right(aTempsTB(i, 1), 13)
        Next i
        wrTB.Range(wrTB.Cells(8, lastColumnTB + 2), wrTB.Cells(lastRowTB, lastColumnTB + 2)).NumberFormat = "[h]:mm:ss.000"
        wrTB.Cells(8, lastColumnTB + 2).FormulaR1C1 = "=TIMEVALUE(RC[-1])"
        wrTB.Cells(8, lastColumnTB + 2).AutoFill Destination:=wrTB.Range(wrTB.Cells(8, lastColumnTB + 2), Cells(lastRowTB, lastColumnTB + 2)), Type:=xlFillDefault
        wrTB.Range(wrTB.Cells(8, lastColumnTB + 1), wrTB.Cells(lastRowTB, lastColumnTB + 1)) = TempsTB
        Columns(lastColumnTB + 2).Copy
        Columns(lastColumnTB + 2).PasteSpecial Paste:=xlPasteValues
        Columns(lastColumnTB + 1).Delete
        wrTB.UsedRange
        lastColumnTB = wrTB.UsedRange.Columns.Count
    End If
End If

基本上,它有效,但它是一些丑陋的解决方法,我想改为更“专业”的东西

如果我将代码更改为:

For i = 1 To lastRowTB - 7
    TempsTB(i - 1, 0) = TimeValue(Right(aTempsTB(i, 1), 13))
Next i

我收到类型不匹配错误,我也尝试设置临时变量以确保数组没有造成麻烦,但它仍然不起作用...

我错过了什么?

3 个答案:

答案 0 :(得分:2)

使用 B1 中的数据,这会将其转换为可用的时间

Sub OutOfTime()
    Dim s As String
    s = Range("B1").Text
    ary = Split(s, " ")
    Range("B1").Formula = "=timevalue(""" & ary(1) & " " & ary(2) & """)"
End Sub

enter image description here

答案 1 :(得分:0)

您可以使用以下公式:

=TIMEVALUE(TEXT(A1,"hh:mm:ss"))

并保留你在那里的文字。

答案 2 :(得分:0)

问题是您的时间对Excel来说太具体了。 Excel仅识别时间到第二个时间。但是你有几毫秒。这就是导致问题的原因以及Excel无法识别的原因。您需要摆脱源中的毫秒数(秒后的点和PM之前的内容)。

不能工作:

Debug.Pring IsDate("6/23/2015 1:05:37.7 PM")

使用:

Debug.Pring IsDate("6/23/2015 1:05:37 PM")