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)
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行之间的转换
它只是工作表本身。还是正确的:工作表功能!
快速测试:
?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只是以正确的方式做到了;)