Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba arg为0时的DateSerial_Vba_Excel - Fatal编程技术网

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))
来查看这一点。