如何在VBA中创建一个{100}之前的日期的Date
变量?
我们有一个VBA项目,该项目从.NET项目中获取一些值,例如一些日期。所有的值都是字符串,我必须将它们转换为VBA中的适当数据类型。
碰巧没有日期,所以我将.NET空日期作为类似于0001-01-01T00:00:00
的字符串获取。使用当前日期,我可以只删除中间的“ T”,而是放置一个空格并将该字符串提供给CDate
函数以获取Date
。当我使用.NET空日期执行此操作时,结果为1/1/2001,因为CDate
假定年份1必须是缩短的年份,并向其加了2000(从1年开始,将2000加到29,并且从30年到99年增加了1900)。
所以我认为我自己会解析字符串,并使用DateSerial
函数来创建适当的日期,但是该函数具有相同的功能。
我可以进行字符串比较,当我获得.NET空日期时,可以将其转换为VBA空日期,但这仅在我真正获得.NET空日期时才有效。一旦获得比该日期稍高的日期(例如0001-01-02T00:00:00
),我就会再次遇到相同的问题。
我知道VBA中的空日期是12/30/1899,我知道我可以使用CDate
函数在该空日期之前创建日期,但是在我看来,我不能不到100岁,还是可以?
答案 0 :(得分:0)
是的,似乎1.1.100是VBA中的某种限制。
内部将日期存储为double值,因此您可以通过在double变量中计算日期,然后将其复制到date变量来强制使用较早的日期,
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
(lpDest As Any, lpSource As Any, ByVal cBytes&)
Public Function MyDateSerial(year As Long, month As Long, day As Long) As Date
Dim d As Double
If year >= 100 Then
MyDateSerial = DateSerial(year, month, day)
Else
d = DateSerial(year + 100, month, day) - (DateSerial(200, 1, 1) - DateSerial(100, 1, 1))
Call CopyMemory(MyDateSerial, d, 8)
End If
End Function
但是要小心,因为几乎所有具有该值的操作都会失败。 直接使用双精度变量存储此类数据可能会更好。 或使用类似的自定义结构
Public Type MyDate
year As Long
month As Long
day As Long
End Type