VBA Excel中的VBA DateValue()中的错误?

史蒂文·马丁

当我使用公式datevalue(“ 01/01/1900”)时,我得到1并格式化为显示为01/01/1900的日期

当我使用VBA时

.Range("A1").Value = DateValue("01/01/1900")

它在单元格中显示为“ 02/01/1900”

这怎么可能?

如果我使用例如

.Range("A1").Value = DateValue("01/01/1901")

它工作正常!

头融化了!!!

Microsoft状态:-“使用Microsoft Excel for Windows中的默认日期系统,date_text参数必须表示1900年1月1日至9999年12月31日之间的日期”

橡皮鸭

简而言之,Excel的DateTime时代与VBA的DateTime时代不同。虽然,他们一旦你过去1900年2月28日相同。

来自Joel Spolksy的博客

在大多数现代编程环境中,日期存储为实数。数字的整数部分是自过去某个约定日期(称为纪元)以来的天数。在Excel中,今天的日期(2006年6月16日)存储为38884,计算1900年1月1日为1的天数。

当我发现Visual Basic文档中有一些奇怪的地方时,我开始研究Basic中的各种日期和时间函数以及Excel中的日期和时间函数:当我注意到Visual Basic文档中的某些奇怪现象时:Basic使用1899年12月31日作为纪元,而不是1月1日, 1900,但由于某种原因,今天的日期在Excel中与在Basic中相同。

??

我去寻找一个Excel开发人员,他的年龄足以记住其原因。Ed Fries似乎知道答案。

“哦,”他告诉我。“请查看1900年2月28日。”

“是59岁,”我说。

“现在尝试3月1日。”

“是61岁!”

“ 60出什么事了?” 埃德问。

“ 1900年2月29日。是a年!它可以被4整除!”

“好猜,但没有雪茄,”埃德说,让我想了一会儿。

哎呀。我做了一些研究。可被100整除的年份不是not年,除非它们也可被400整除。

1900年不是a年。

“这是Excel中的错误!” 我大叫。

“恩,不是真的,”埃德说。“我们必须那样做,因为我们需要能够导入Lotus 123工作表。”

“那么,这是Lotus 123中的错误吗?”

“是的,但是可能是有意的一年。Lotus必须容纳640K。这不是很多内存。如果您忽略1900,则可以通过查看最右边的两位来确定给定的年份是否是a年。为零,这确实非常快捷。Lotus成员可能认为过去两个月来的错误并不重要,Basic成员想对这两个月进行分析,因此他们将时代回到过去。”

“啊!” 我说了,然后去研究为什么在选项对话框中有一个复选框叫1904 Date System。


以下信息来自超级用户答案


如Microsoft KB 214058中所述

1900年3月1日之前的星期几在Excel中不正确

更多信息

最初在Microsoft Excel中创建日期系统时,它被设计为与其他电子表格程序使用的日期系统完全兼容。

但是,在此日期系统中,1900年被错误地解释为a年。因为在1900年没有2月29日(“ le日”),所以不能正确计算1900年3月1日之前任何日期的星期几(“ after日”之后的日子)。

“其他电子表格程序”是指Lotus 1-2-3,当时它很流行,并且错误地认为1900年是a年。KB 214326中对此进行了更详细的说明

Excel 2000错误地认为1900年是is年

更多信息

当Lotus 1-2-3首次发布时,该程序假定1900年是a年,即使实际上不是a年。这使程序更容易处理leap年,并且对Lotus 1-2-3中的几乎所有日期计算都没有损害。

当Microsoft Multiplan和Microsoft Excel发布时,他们还假定1900年是a年。此假设使Microsoft Multiplan和Microsoft Excel可以使用Lotus 1-2-3使用的相同序列日期系统,并提供与Lotus 1-2-3的更大兼容性。将1900年视为a年,也使用户更容易将工作表从一个程序移动到另一个程序。

尽管从技术上可能会纠正此问题,以使当前版本的Microsoft Excel不会假定1900年是a年,但这样做的弊大于利。

如果要纠正此行为,则会出现许多问题,包括以下问题:

  • 当前Microsoft Excel工作表和其他文档中的几乎所有日期都将减少一天。纠正此偏移将花费大量时间和精力,尤其是在使用日期的公式中。
  • 某些函数(例如WEEKDAY函数)将返回不同的值;这可能会导致工作表中的公式无法正常工作。
  • 纠正此行为将破坏Microsoft Excel和其他使用日期的程序之间的串行日期兼容性。

如果行为仍然未纠正,则只会发生一个问题:

  • WEEKDAY函数对于1900年3月1日之前的日期返回错误的值。因为大多数用户不使用1900年3月1日之前的日期,所以很少出现此问题。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章