VBA Excel中的VBA DateValue()中的错误?
当我使用公式datevalue(“01/01/1900”)时,我得到1并格式化为显示为01/01/1900的date
当我使用VBA
.Range("A1").Value = DateValue("01/01/1900")
它在单元格中显示为“02/01/1900”
这怎么可能?
如果我使用例如
.Range("A1").Value = DateValue("01/01/1901")
它工作正常!
头融化了!
Microsoft声明:“使用Windows的Microsoft Excel中的默认date系统,date_text参数必须表示1900年1月1日至9999年12月31日之间的date”
简而言之,Excel的DateTime时代与VBA的DateTime时代并不相同。 尽pipe1900年2月28日过后,他们是一样的。
从Joel Spolksy的博客 :
在大多数现代编程环境中,date都以实数forms存储。 数字的整数部分是自过去某个约定的date以来的天数,称为时代。 在Excel中,今天的date(2006年6月16日)被存储为38884,计算1900年1月1日为1的日子。
我开始使用Basic中的各种date和时间函数以及Excel中的date和时间函数,当我在Visual Basic文档中发现一些奇怪的东西时,尝试了一些东西:Basic使用1899年12月31日作为时代而不是1月1日, 1900年,但由于某种原因,今天的date在Excel中是一样的,在基本。
咦?
我去找一个足够大的Excel开发人员来记住为什么。 埃德·弗里斯似乎知道答案。
“哦,”他告诉我。 “1900年2月28日退房”
“这是59,”我说。
“现在尝试三月一号。”
“这是61!
“60发生了什么事?” 埃德问道。
“二月二十九号,1900年是闰年,可以被四整除!”
“好猜,但不要雪茄,”埃德说,然后让我想了一会儿。
哎呀。 我做了一些研究。 可以被100整除的年份不是闰年,除非它们也可以被400整除。
1900年不是一个闰年。
“这是Excel中的一个错误!” 我惊呼。
“呃,不是真的,”埃德说。 “我们必须这样做,因为我们需要能够导入Lotus 123工作表”。
“那么,这是Lotus 123的一个bug?”
“是的,但可能是故意的,莲花必须适合640K,这并不是很多的内存,如果你忽略了1900,你可以通过查看最右边的两位来判断给定的年份是否是一个闰年这真的很快,很容易,莲花家伙也许认为过去两个月没有问题,看起来基本的家伙想肛交两个月,所以他们搬走了有一天回来了“。
“AARGH!” 我说,然后去研究为什么在名为1904date系统的选项对话框中有一个checkbox。
下面的信息是从这个超级用户的答案 。
如Microsoft 知识库214058中所述 :
在Excel中,1900年3月1日之前一周中的天数不正确
更多信息
当Microsoft Excel中的date系统最初创build时,它被devise为与其他电子表格程序使用的date系统完全兼容。
然而,在这个date系统中,1900年被错误地解释为闰年。 因为在1900年没有2月29日(“闰日”),1900年3月1日以前(“闰日”之后的那一天)的任何一天中的某一天的date计算不正确。
“其他电子表格程序”是指当时颇受欢迎的Lotus 1-2-3 ,错误地认为1900年是一个闰年。 这在KB 214326中有更详细的解释:
Excel 2000错误地假定1900年是一个闰年
更多信息
当Lotus 1-2-3首次发布时,该计划假定1900年是一个闰年,即使它实际上不是一个闰年。 这使得程序更容易处理闰年,并且几乎不会影响Lotus 1-2-3中的所有date计算。
当Microsoft Multiplan和Microsoft Excel发布时,他们也认为1900年是一个闰年。 这个假设允许Microsoft Multiplan和Microsoft Excel使用Lotus 1-2-3使用的相同的序列date系统,并提供与Lotus 1-2-3更好的兼容性。 1900年作为一个闰年,也使用户更容易将工作表从一个程序移动到另一个程序。
尽pipe在技术上可以纠正这种行为,以便当前版本的Microsoft Excel不会假定1900年是闰年,但这样做的缺点大于优点。
如果这种行为得到纠正,会出现许多问题,包括:
- 当前Microsoft Excel工作表和其他文档中的几乎所有date都会减less一天。 纠正这种转变需要花费相当多的时间和精力,特别是在使用date的公式中。
- 一些函数,如WEEKDAY函数,会返回不同的值; 这可能会导致工作表中的公式无法正常工作。
- 更正此行为将打破Microsoft Excel和其他使用date的程序之间的序列date兼容性。
如果行为仍未纠正,则只会出现一个问题:
- 1900年3月1日之前,WEEKDAY函数返回错误的date值。因为大多数用户不使用1900年3月1日之前的date,所以这个问题很less见。