以下 Excel VBA 代码比较了 Variant 数组与 Date 成员以及 Date 数组中累积小时数(一天的 1/24)的效果。我将 C、E、G 列格式化为日期,将 D、F、H 列格式化为具有大量 dps 的数字 在 A 列和 BI 列中使用工作表函数复制了计算。在您尝试之前,您可能不会相信这一点,但是 Date 的 Variant 数组的最后输出是提前 1 天。VBA 报告为 39814.9999999999 的数值在 Excel 中转换为 39814。
编辑:当我说日期格式的列 C、E、G 时,我的意思是自定义“dd/mm/yyyy hh:mm:ss.00”。
有人见过这个吗?但更重要的是,我如何知道在使用 Variants 时我可以信任什么?我有数万行要维护,并且在我们需要对 Excel 数据进行密集处理的任何地方都使用 Variant 数组。
Sub FillDatesBug()
Dim dtHours() As Date
Dim vHours As Variant
Dim vHours2 As Variant
Dim dtHour As Date
Dim dHour As Double
Dim i As Long
ReDim dtHours(1 To 25, 1 To 1)
ReDim vHours(1 To 25, 1 To 1)
ReDim vHours2(1 To 25, 1 To 1)
dtHour = CDate(1 / 24)
dHour = 1 / 24
dtHours(1, 1) = CDate(39814)
vHours(1, 1) = CDate(39814)
vHours2(1, 1) = 39814#
For i = 2 To 25
dtHours(i, 1) = dtHours(i - 1, 1) + dtHour
vHours(i, 1) = vHours(i - 1, 1) + dtHour
vHours2(i, 1) = vHours2(i - 1, 1) + dHour
Next i
Range("C2:C26").Value = dtHours
Range("D2:D26").Value = dtHours
Range("E2:E26").Value = vHours
Range("F2:F26").Value = vHours
Range("G2:G26").Value = vHours2
Range("H2:H26").Value = vHours2
Range("C28").Value = "dtHours(25,1) = " & dtHours(25, 1) & " or " & CDbl(dtHours(25, 1))
Range("E28").Value = "vHours(25,1) = " & vHours(25, 1) & " or " & CDbl(vHours(25, 1))
Range("G28").Value = "vHours2(25,1) = " & Format(vHours2(25, 1), "dd/mm/yyyy hh:mm:ss") & " or " & vHours2(25, 1)
End Sub
这是一个屏幕截图- 显然,我没有代表来显示它。
如您所见,一个 Date 数组和一个具有 Double 成员的 Variant 数组得到了正确的答案(包括完全正常和理解的数字错误)。带有 Date 成员的 Variant 数组中的某些值被错误地转换为 Excel。
第一个真正看到我在这里说的话的人会赢得我永远的感激。