VBA没有用Now()返回正确的日期

时间:2018-01-29 10:24:17

标签: excel vba excel-vba date

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

Sub Test_Date ()

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

End Sub

返回:

Dez
 1 
29.01.2018 11:17:55 

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

1 个答案:

答案 0 :(得分:9)

这是一个已知问题。它实际上不是问题。

onDataChange()你正在路过 Debug.Print Format(Month(Now()), "mmm")

VBA的第一天是Debug.Print Format(1,"mmm")。它的月份是31.12.1899。运行这一小段代码来查看它:

December

如果您想要当前日期的月份 - Sub TestMe() Debug.Print Format(1, "dd-mmm-yyyy") End Sub

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

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

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

因此,取决于4"环境中的哪一个"您正在工作,今天的日期(2018年1月29日)可以转换为以下之一:

  • 41667(Excel with Date1904)
  • 43128(MSSQL Server 02.January.1904
  • 43129(Excel)
  • 43129(VBA)

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

  • 03.Fecess.1900(VBA)
  • 04.February.1900(Excel)
  • 05. Feb00.100(MSSQL Server - SELECT CONVERT(INT, CONVERT(DATETIME,GETDATE()))
  • 05.February.1904(Excel with Date1904)

这篇文章(由SO的所有者撰写)给出了一些额外的启示: My First BillG Review