早上好,
我在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
我收到类型不匹配错误,我也尝试设置临时变量以确保数组没有造成麻烦,但它仍然不起作用...
我错过了什么?
答案 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
答案 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")