【问题标题】:DateSerial when arg is 0arg 为 0 时的 DateSerial
【发布时间】:2018-02-25 04:14:51
【问题描述】:

我注意到了一些奇怪的事情。假设我有一个函数:

Function ds(l As Long) As String
  ds = DateSerial(Year(l), Month(l), Day(l))
End Function

当我输入 ds(date) 时,我会得到代表当前日期的字符串。如果我输入 ds(1),它会返回 31/12/1899。 ds(-1) 返回 1899 年 12 月 29 日。然后,ds(0) 带来:00:00:00。人们可以期待 1899 年 12 月 30 日,不是吗? 好吧,这不是生死攸关的问题,但我很好奇,为什么 DateSerial 会这样?

【问题讨论】:

    标签: vba excel


    【解决方案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 中不能表示为日期,因为它会报错,因此问题少了一个:


    最简单的答案:

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

    【讨论】:

    • 感谢您的回复。但是,无论如何,参数 -1 不会导致我的小函数出错。只有 0 会返回意外结果。
    • @MarcinSzaleniec - 这是因为 DateSerial(1899,12,30) 被评估为 0 并且无法将其呈现为日期。因此,它给出了00:00:00。通过在即时窗口中写入?clng(DateSerial(1899,12,30)) 来查看此内容。
    猜你喜欢
    • 2014-04-14
    • 1970-01-01
    • 2020-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-06
    相关资源
    最近更新 更多