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

时间:2015-01-11 20:51:47

标签: excel vba

当我使用公式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日之间的日期"

1 个答案:

答案 0 :(得分:4)

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

来自Joel Spolksy's blog

  

在大多数现代编程环境中,日期存储为真实日期   数字。数字的整数部分是自以后的天数   在过去的一些商定日期,称为时代。在今天的Excel中   日期,2006年6月16日,存储为38884,计算1月份的日期   1900年1月1日。

     

我开始在Basic中使用各种日期和时间函数   以及Excel中的日期和时间功能,当我尝试时   注意到Visual Basic文档中有一些奇怪的东西:Basic   使用1899年12月31日作为时代而不是1900年1月1日,但是   出于某种原因,今天的日期与Excel中的日期相同   基本

     

咦?

     

我去找一位年龄足以记住原因的Excel开发人员。   艾德弗里斯似乎知道答案。

     

" OH,#34;他告诉我。 " 1900年2月28日退房。"

     

"它的59,"我说。

     

"现在尝试3月1日。"

     

"它是61!"

     

" 60岁发生了什么?"艾德问道。

     

" 2月29日。 1900年是闰年!它可以被4整除!"

     

"好猜,但没有雪茄,"埃德说,让我想知道一个   而

     

糟糕。我做了一些研究。可以被100整除的年份不是   闰年,除非它们也能被400整除。

     

1900年不是闰年。

     

"这是Excel中的一个错误!"我大声说道。

     

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

     

"那么,它是Lotus 123中的一个错误?"

     

"是的,但可能是故意的。莲花必须适合640K。   这不是很多记忆。如果忽略1900,你可以弄清楚是否   一年只是一个闰年,只要看看最右边的那一年   两位为零。这真的很快,很容易。莲花人   可能认为这两个月的错误并不重要   在过去。看起来像Basic的家伙想要肛门   那两个月,所以他们有一天回到了这个时代。"

     

"&AARGH#34!;我说,然后开始研究为什么有一个复选框   选项对话框,名为1904 Date System。


以下信息取自this Super User answer


如Microsoft KB 214058中所述:

  

Days of the week before March 1, 1900 are incorrect in Excel

     

更多信息

     

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

     

但是,在此日期系统中,1900年被错误地解释为闰年。因为在1900年没有2月29日("闰日"),在1900年3月1日之前的任何日期(在"闰日&#34之后的那一天)的星期几; ,计算不正确。

"其他电子表格程序"请参考当时非常受欢迎的Lotus 1-2-3,并错误地认为1900年是闰年。这在KB 214326

中有更详细的解释
  

Excel 2000 incorrectly assumes that the year 1900 is a leap year

     

更多信息

     

当莲花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日之前不使用日期,因此这个问题很少见。
  •