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

Roh*_*han 12 excel vba date excel-vba

在此输入图像描述

我使用的是Windows 10 OS excel 13所以在下面的代码中1应该返回1/1/1900正确的?下面不是为什么.

这个问题上,OP通过2016并获得了相同的结果,如果有一些错误,我为什么在通过时获得与OP相同的结果2016

Sub ndat()

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

End Sub
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

Gar*_*ent 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
Run Code Online (Sandbox Code Playgroud)

生产:

在此输入图像描述

注意,你可以先拿到日期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
Run Code Online (Sandbox Code Playgroud)

填写C栏:

在此输入图像描述

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

  • 因此,假设差异存在是公平的,因为在*工作表*中由于Lotus 1-2-3错误而需要这样做,而在VBA中从来没有要求这种向后兼容性 - 因此从理论上讲,VBA是,而且一直都是正确的? (2认同)

Dir*_*hel 5

它只是工作表本身。还是正确的:工作表功能!

快速测试:

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

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

?clng(now)
 42463 
?worksheetfunction.Text(now,"0")
42463
Run Code Online (Sandbox Code Playgroud)

这表明在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
Run Code Online (Sandbox Code Playgroud)

仅是最后一次测试以再次显示它:

?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
Run Code Online (Sandbox Code Playgroud)

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

另外:这是excel的“功能”,与基本,vbscript,vba没有关系..........所有其他程序都以正确的方式工作,如果VBA不这样做,将会带来很多麻烦。因此,为了实现“兼容性”,Excel中的VBA只是以正确的方式做到了;)