我注意到一些奇怪的事情。假设我有一个功能:
Function ds(l As Long) As String
ds = DateSerial(Year(l), Month(l), Day(l))
End Function
当我输入ds(日期)时,我会得到代表当前日期的字符串。如果我输入ds(1),它将返回31/12/1899。 ds(-1)返回29/12/1899。然后,ds(0)带来:00:00:00。人们可以期待30/12/1899,不是吗? 嗯,这不是生死攸关的问题,但我很好奇,为什么DateSerial会这样做?
答案 0 :(得分:1)
简答:
0
转换为日期真是一个艰难的价值。
因此,它被跳过了。否则会破坏程序中的许多业务逻辑。这是我个人的发现,在VBA中为0 - Why is 0 divided by 0 throwing an overflow error in VBA?
更长的回答:
通常,1
是VBA和Excel中的第一个日期值。
在VBA中,1
表示为31.12.1899
在Excel中,它表示为01.01.1900
或01.01.1904
,具体取决于您是否在Excel中启用了1904日期系统。 MSDN 1904 date system.
好处是-1
(以及所有负值)无法在Excel中表示为日期,因为它会产生错误,因此可以减少一个问题:
最简单的回答:
DateSerial接受年份100到9999之间的参数,因此-1
超出了他们的范围 - DateSerial MSDN。 Year()
相应地从1
到9999
接受,因此-1
和0
也在边界之外。 Year MSDN