VBA不会使用Now()返回正确的日期

Pie*_*e44 2 excel vba date excel-vba

我有一个简单的代码,VBA无法返回正确的日期:

Sub Test_Date ()

Debug.Print Format(Month(Now()), "mmm")
Debug.Print Month(Now())
Debug.Print Now()

End Sub
Run Code Online (Sandbox Code Playgroud)

返回:

Dez
 1 
29.01.2018 11:17:55 
Run Code Online (Sandbox Code Playgroud)

1)这是一个众所周知的Excel问题还是我犯了错误?

Vit*_*ata 9

这是一个众所周知的问题.它实际上不是问题.

Debug.Print Format(Month(Now()), "mmm")你逝去 Debug.Print Format(1,"mmm").

而VBA的第一天就是31.12.1899.它的月份是December.运行这一小段代码来查看它:

Sub TestMe()
    Debug.Print Format(1, "dd-mmm-yyyy")
End Sub
Run Code Online (Sandbox Code Playgroud)

如果你想要当前日期的月份 - Format(Now, "mmm")


通常,在Excel,VBA和MSSQL Server中处理日期时要小心.日期将转换为数字.例如,每个日期都转换为数字,但起始编号可能略有不同.

  • 在Excel中,1转换为01.January.1900;
  • 在VBA中,1转换为31.December.1899;
  • 在MSSQL Server中,1转换为02.January.1900(SELECT CONVERT(DATETIME,1));
  • 在Excel中,如果激活ActiveWorkbook.Date1904=True属性,1则转换为02.January.1904;

造成这种情况的原因是Lotus 1-2-3的创建者所犯的错误,他们认为29.02.1900是一个有效的日期.因此,Excel希望与Lotus 1-2-3兼容,并且他们继续使用此错误.在VBA中,他们决定不实现错误,因此VBA和Excel中的日期有点不同,但这仅适用于1900年3月1日 - MSDN日期说明.

因此,根据您上面的4个"环境"中的哪一个,今天的日期(2018年1月29日)可以转换为以下之一:

  • 41667(Excel with Date1904)
  • 43128(MSSQL Server SELECT CONVERT(INT, CONVERT(DATETIME,GETDATE())))
  • 43129(Excel)
  • 43129(VBA)

如果您在Excel,VBA和MSSQL Server中使用35.天并将其转换为日期,结果将如下所示:

  • 03. 2009年2月(VBA)
  • 04. 2009年2月(Excel)
  • 05.February.1900(MSSQL Server - SELECT CONVERT(DATETIME,35))
  • 05.February.1904(Excel with Date1904)

这篇文章(由SO的所有者撰写)给出了一些额外的启示: 我的第一个BillG评论