VBA / VB6中的古代日期(年份为2位数字)

时间:2018-08-08 06:44:26

标签: vba vb6

如何在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岁,还是可以?

1 个答案:

答案 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