arg为0时的DateSerial

时间:2017-11-24 13:28:11

标签: 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)返回29/12/1899。然后,ds(0)带来:00:00:00。人们可以期待30/12/1899,不是吗? 嗯,这不是生死攸关的问题,但我很好奇,为什么DateSerial会这样做?

1 个答案:

答案 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.190001.01.1904,具体取决于您是否在Excel中启用了1904日期系统。 MSDN 1904 date system.

好处是-1(以及所有负值)无法在Excel中表示为日期,因为它会产生错误,因此可以减少一个问题:

enter image description here

最简单的回答:

DateSerial接受年份100到9999之间的参数,因此-1超出了他们的范围 - DateSerial MSDNYear()相应地从19999接受,因此-10也在边界之外。 Year MSDN