Vba arg为0时的DateSerial
我注意到了一些奇怪的事情。假设我有一个函数:Vba arg为0时的DateSerial,vba,excel,Vba,Excel,我注意到了一些奇怪的事情。假设我有一个函数: 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)返回1899年12月29日。然后,ds(0)带来:00:00:00。人们可以期待1899年12月30日,不是吗? 嗯,这不是生死攸关的问题,但我很好奇,
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)返回1899年12月29日。然后,ds(0)带来:00:00:00。人们可以期待1899年12月30日,不是吗?
嗯,这不是生死攸关的问题,但我很好奇,为什么DateSerial会这样做 简短回答:
0
是一个很难转换为日期的值。
因此,它被跳过。否则它会破坏程序中的许多业务逻辑。这是我在VBA中对0的个人发现-
更长的回答: 通常,
1
是VBA和Excel中的第一个日期值
在VBA中,1
表示为31.12.1899
在Excel中,它表示为01.01.1900
或01.01.1904
,具体取决于您是否在Excel中启用了1904日期系统
好的是,-1
(以及所有负值)不能在Excel中表示为日期,因为它会给出一个错误,因此少了一个问题:
最简单的答案:
DateSerial接受年份介于100和9999之间的参数,因此
-1
超出其范围-Year()
相应地从1
接受到9999
,因此-1
和0
也在边界之外 谢谢你的回复。但是,无论如何,参数-1不会在我的小函数中导致错误。只有0返回意外结果。@MarcinSzaleniec-这是因为DateSerial(1899,12,30)
的计算结果为0
,无法将其表示为日期。因此,它给出00:00:00
。通过在即时窗口中写入?clng(DateSerial(1899,12,30))
来查看这一点。