VBA doesn't return the correct Date with Now()

回眸只為那壹抹淺笑 提交于 2020-01-01 19:00:10

问题


I have a simple code and VBA cannot return the correct date:

Sub Test_Date ()

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

End Sub

Returns:

Dez
 1 
29.01.2018 11:17:55 

1) Is that an Excel well known issue or did I make a mistake?


回答1:


It is a known issue. And it is actually not an issue.

In Debug.Print Format(Month(Now()), "mmm") you are passing Debug.Print Format(1,"mmm").

And the first day in VBA is 31.12.1899. And its month is December. Run this small piece of code to see it:

Sub TestMe()
    Debug.Print Format(1, "dd-mmm-yyyy")
End Sub

If you want the month of the current date - Format(Now, "mmm")


In general, be a bit careful, when you are working with dates in Excel, VBA and MSSQL Server. The dates are converted to numbers. E.g., every date is converted to a number, but the starting number can be a bit different.

  • In Excel, the 1 is converted to 01.January.1900;
  • In VBA, the 1 is converted to 31.December.1899;
  • In MSSQL Server, the 1 is converted to 02.January.1900 (SELECT CONVERT(DATETIME,1));
  • In Excel, if you activate the ActiveWorkbook.Date1904=True property, the 1 is converted to 02.January.1904;

The reason for this is an error, made by the creators of Lotus 1-2-3, who have thought that 29.02.1900 was a valid date. Thus, Excel wanted to become compatible with Lotus 1-2-3 and they have carried on with this error. In VBA, they have decided not to implement the error, thus the dates in VBA and Excel are a bit different, but this is only for the period up to 1. March 1900 - MSDN date explanation.

Thus, depending on which one of the 4 "environments" above you are working, today's date (29-January-2018) can be converted to one of the following:

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

If you take the 35. day and convert it to date in Excel, VBA and MSSQL Server, the result will be as follows:

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

This article (written by the owner of SO) gives some addition enlightment: My First BillG Review



来源:https://stackoverflow.com/questions/48498998/vba-doesnt-return-the-correct-date-with-now

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!