当1传递给它时,为什么日期返回“31-12-1899”?

时间:2016-04-02 20:41:30

标签: excel vba excel-vba date

enter image description here

我正在使用Windows 10 OS excel 13,因此在下面的代码1中应该返回1/1/1900对吗?下面不是为什么。

this问题OP传递2016并得到相同的结果我得到了如果有一些错误,为什么我在通过2016时得到与OP相同的结果?

Sub ndat()

Dim dt As Date
dt = 2016
Debug.Print "dt is " & dt

End Sub

enter image description here

2 个答案:

答案 0 :(得分:6)

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

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

产地:

enter image description here

请注意,您可以在 1/1/1900

之前获取日期

修改#1:

这可能有助于理解其中的差异。我在列 A 中添加了一些整数。

B1 中,我将=A1复制下来。我将列 B 格式化为以日期格式显示。

我使用这个UDF():

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

填写 C

enter image description here

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

答案 1 :(得分:4)

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

快速测试:

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

但今天的日期并没有显示出这个差距:

?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

再次展示它的最后一次测试:

?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的“功能”,与basic,vbscript,vba无关..........所有其他程序都以正确的方式工作,如果遇到麻烦,会遇到很多麻烦VBA不会。因此,对于“兼容性”,excel中的VBA只是以正确的方式执行;)