当我使用公式datevalue("01/01/1900")时,我得到1并格式化为显示为01/01/1900的日期
当我使用VBA时
.Range("A1").Value = DateValue("01/01/1900")
Run Code Online (Sandbox Code Playgroud)
它在单元格中显示为"02/01/1900"
这怎么可能?
如果我使用例如
.Range("A1").Value = DateValue("01/01/1901")
Run Code Online (Sandbox Code Playgroud)
它工作正常!
头融化!!!
Microsoft声明 - "在Microsoft Excel for Windows中使用默认日期系统,date_text参数必须表示1900年1月1日到9999年12月31日之间的日期"
简而言之,Excel 的 DateTime 纪元与 VBA 的 DateTime 纪元不同。虽然,他们是一旦你过去1900年2月28日相同。
在大多数现代编程环境中,日期存储为实数。数字的整数部分是自过去某个约定日期以来的天数,称为纪元。在 Excel 中,今天的日期 2006 年 6 月 16 日存储为 38884,计算天数,其中 1900 年 1 月 1 日为 1。
我开始研究 Basic 中的各种日期和时间函数以及 Excel 中的日期和时间函数,进行尝试,当我注意到 Visual Basic 文档中有一些奇怪的东西时:Basic 使用 1899 年 12 月 31 日而不是 1 月 1 日作为纪元, 1900 年,但由于某种原因,今天的日期在 Excel 中与在 Basic 中的日期相同。
嗯?
我去找了一位年纪大到能记住原因的 Excel 开发人员。Ed Fries 似乎知道答案。
“哦,”他告诉我。“看看 1900 年 2 月 28 日。”
“是59,”我说。
“现在试试 3 月 1 日。”
“是61!”
“60怎么了?” 埃德问道。
“2 月 29 日。1900 年是闰年!它可以被 4 整除!”
“很好的猜测,但没有雪茄,”埃德说,让我想了一会儿。
哎呀。我做了一些研究。能被 100 整除的年份不是闰年,除非它们也能被 400 整除。
1900年不是闰年。
“这是 Excel 中的错误!” 我惊呼道。
“嗯,不是真的,”埃德说。“我们必须这样做,因为我们需要能够导入 Lotus 123 工作表。”
“所以,这是Lotus 123中的一个错误?”
“是的,但可能是故意的。Lotus 必须适合 640K。这不是很多内存。如果您忽略 1900,您可以通过查看最右边的两位是否为闰年来确定给定年份是否为闰年是零。这真的很快而且很容易。Lotus 的人可能认为过去那两个月的方式错了没有关系。看起来 Basic 的人想在这两个月里做肛门,所以他们移动了一天回到纪元。”
“啊!” 我说,然后去研究为什么选项对话框中有一个名为 1904 日期系统的复选框。
下面的信息取自这个超级用户的回答。
如 Microsoft KB 214058 中所述:
1900 年 3 月 1 日之前的星期几在 Excel 中不正确
更多信息
最初创建 Microsoft Excel 中的日期系统时,它被设计为与其他电子表格程序使用的日期系统完全兼容。
但是,在此日期系统中,1900 年被错误地解释为闰年。由于 1900 年没有 2 月 29 日(“闰日”),因此无法正确计算 1900 年 3 月 1 日(“闰日”之后的一天)之前的任何日期的星期几。
“其他电子表格程序”指的是当时非常流行的Lotus 1-2-3,并错误地认为 1900 年是闰年。这在KB 214326 中有更详细的解释:
Excel 2000 错误地假定 1900 年是闰年
更多信息
当 Lotus 1-2-3 首次发布时,该程序假定 1900 年是闰年,尽管它实际上不是闰年。这使得程序更容易处理闰年,并且不会对 Lotus 1-2-3 中的几乎所有日期计算造成损害。
当 Microsoft Multiplan 和 Microsoft Excel 发布时,他们还假设 1900 年是闰年。这种假设允许 Microsoft Multiplan 和 Microsoft Excel 使用与 Lotus 1-2-3 相同的序列日期系统,并提供与 Lotus 1-2-3 的更大兼容性。将 1900 年视为闰年也使用户更容易将工作表从一个程序移动到另一个程序。
尽管在技术上可以更正此行为,以便当前版本的 Microsoft Excel 不会假定 1900 年是闰年,但这样做的弊大于利。
如果要纠正这种行为,则会出现许多问题,包括:
- 当前 Microsoft Excel 工作表和其他文档中的几乎所有日期都将减少一天。纠正这种转变需要花费大量的时间和精力,尤其是在使用日期的公式中。
- 某些函数,例如 WEEKDAY 函数,会返回不同的值;这可能会导致工作表中的公式无法正常工作。
- 更正此行为会破坏 Microsoft Excel 和其他使用日期的程序之间的串行日期兼容性。
如果该行为仍未得到纠正,则只会出现一个问题:
- WEEKDAY 函数为 1900 年 3 月 1 日之前的日期返回不正确的值。因为大多数用户不使用 1900 年 3 月 1 日之前的日期,所以此问题很少见。