为什么date返回“31-12-1899”1时传递给它?

在这里输入图像描述

我使用的Windows 10操作系统excel 13,所以在下面的代码1应该返回1/1/1900吧? 下面这不是为什么。

在这个问题OP通过2016 ,得到了同样的结果,我得到了如此,如果有一些错误,为什么我得到了同样的结果,当我通过2016 OP?

 Sub ndat() Dim dt As Date dt = 2016 Debug.Print "dt is " & dt End Sub 

在这里输入图像说明

VBA中的整数和date映射与工作表中的不同。 例如:

 Sub marine() Dim i As Integer, d As Date Dim mgs As String msg = "" For i = -10 To 10 d = CDate(i) msg = msg & i & vbTab & Format(d, "mm/dd/yyyy") & vbCrLf Next i MsgBox msg End Sub 

生产:

在这里输入图像说明

请注意,您可以在1/1/1900之前获得date

编辑#1:

这可能有助于了解差异。 我把一些整数放在A列。

B1中 ,我把=A1和拷贝下来。 我格式化B列以date格式显示。

我使用这个UDF():

 Public Function VBA_Date(i As Long) As String VBA_Date = Format(CDate(i), "mm/dd/yyyy") End Function 

填写栏C

在这里输入图像描述

请注意行#19和#20之间的转换

这只是工作表本身。 或者是正确的:工作表function!

快速testing:

 ?cdate(1) 1899-12-31 ?format(1,"YYYY-MM-DD") 1899-12-31 ?worksheetfunction.Text(1,"YYYY-MM-DD") 1900-01-01 

但今天的date并没有显示出这样的差距:

 ?clng(now) 42463 ?worksheetfunction.Text(now,"0") 42463 

这表明1到42463之间是一个差距(快速莲花检查显示:

 ?cdate(60) & " --- " & cdate(61) 1900-02-28 --- 1900-03-01 ?format(60,"YYYY-MM-DD") & " --- " & format(61,"YYYY-MM-DD") 1900-02-28 --- 1900-03-01 ?worksheetfunction.Text(60,"YYYY-MM-DD") & " --- " & worksheetfunction.Text(61,"YYYY-MM-DD") 1900-02-29 --- 1900-03-01 

只是最后一个testing再次显示:

 ?format("1900-02-28","0") & " --- " & format("1900-03-01","0") 60 --- 61 ?worksheetfunction.Text("1900-02-28","0") & " --- " & worksheetfunction.Text("1900-03-01","0") 59 --- 61 

从61开始,现在只是在数量上有所不同。 但是Lotus-Bug为“兼容性”添加了1900-02-29。

另外:这是excel的一个“function”,与basic,vbscript,vba无关……….所有其他程序都以正确的方式工作,如果VBA不会。 所以对于“兼容”,excel中的VBA只是以正确的方式进行;)