将Excel VBA中的日期写入工作表会给出错误的值

Che*_*hel 6 excel time vba excel-vba

当我将VBA中的日期写入Excel工作表时,有时工作表上的值最终会比我预期的少一天(提前一天).这是我在使用Excel 2003,2007和2010的多台计算机上测试过的示例.从即时窗口:

?Format(41652.9999999963, "yyyy-mm-dd hh:mm:ss")

> 2014-01-14 00:00:00

[A1].value = CDate(41652.9999999963)
?Format([A1].value, "yyyy-mm-dd hh:mm:ss")

> 2014-01-13 00:00:00

[A1].value = CDbl(CDate(41652.9999999963))
?Format([A1].value, "yyyy-mm-dd hh:mm:ss")

> 2014-01-14 00:00:00
Run Code Online (Sandbox Code Playgroud)

究竟是什么引发了这个

编辑:

好的,让我更清楚一点,这不是一个四舍五入的问题.如果我上升或下降一小时,我得到正确的时间.只是如果我接近这个确切的数字,那么日期就会消失一整天:

[A1].value = CDate(41652.99999)
?Format([A1].value, "yyyy-mm-dd hh:mm:ss")

> 2014-01-13 23:59:59

[A1].value = CDate(41652.999999999996)
?Format([A1].value, "yyyy-mm-dd hh:mm:ss")

> 2014-01-13 00:00:00

[A1].value = CDate(41652.999999999997)
?Format([A1].value, "yyyy-mm-dd hh:mm:ss")

> 2014-01-14 00:00:00

[A1].value = CDate(41653.00001)
?Format([A1].value, "yyyy-mm-dd hh:mm:ss")

> 2014-01-14 00:00:01
Run Code Online (Sandbox Code Playgroud)

Apo*_*s55 1

如 CDate 的帮助中所述,“CDate 识别日期文字和时间文字以及可接受日期范围内的一些数字。将数字转换为日期时,整数部分将转换为日期任何小数部分数字的值被转换为一天中的某个时间,从午夜开始。” 它从未说过四舍五入到第二天的时间会增加日期!我相信这可以解开这个谜团。

事实上,您可以自己使用 round 来获得所需的结果。测试表明 9 位数字是舍入的最高数字,而 10 位数字会产生不良效果......

[a1]=cdate(round(41652.9999999999,8))--> 14/01/14 00:00

[a1]=cdate(round(41652.9999999999,10))--> 2014 年 1 月 13 日 00:00

注释后添加代码:

Sub dower() 

Dim v1 As Double, vdt As Date, vv As Variant, vdbl As Double
Range("a1:a6").ClearContents

v1 = 41652.9999999996
vdt = CDate(v1)
vv = CDate(v1)
vdbl = CDate(v1)

[a1] = v1
[a2] = vdt
[a3] = vv
[a4] = vdbl

vdt = CDbl(v1)
[a5] = vdt

End Sub
Run Code Online (Sandbox Code Playgroud)