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

VBA/VB6中的古代日期(2位数年),vba,vb6,Vba,Vb6,如何在VBA中创建一个Date变量来保存100年前一年的日期 我们有一个VBA项目,它从.NET项目中获取一些值,例如一些日期。所有的值都是字符串,我必须在VBA中将它们转换为适当的数据类型。 碰巧没有日期,所以我将.NET空日期作为字符串获取,如0001-01-01T00:00:00。用当前日期,我可以只删除中间的“T”,放一个空格,并将该字符串交给 cDeD>代码>函数,以获得日期。当我使用.NET空日期执行此操作时,我得到的结果是2001年1月1日,因为CDate假定第一年必须是缩短的一年

如何在VBA中创建一个
Date
变量来保存100年前一年的日期

我们有一个VBA项目,它从.NET项目中获取一些值,例如一些日期。所有的值都是字符串,我必须在VBA中将它们转换为适当的数据类型。 碰巧没有日期,所以我将.NET空日期作为字符串获取,如
0001-01-01T00:00:00
。用当前日期,我可以只删除中间的“T”,放一个空格,并将该字符串交给<代码> cDeD>代码>函数,以获得<代码>日期<代码>。当我使用.NET空日期执行此操作时,我得到的结果是2001年1月1日,因为
CDate
假定第一年必须是缩短的一年,并将2000加上它(从第一年到第29年,它将2000加上,从第30年到第99年,它将1900加上)

所以我想我自己解析字符串,并使用
DateSerial
函数来创建合适的日期,但是这个函数做同样的事情

我可以进行字符串比较,当我得到.NET空日期时,我可以将其转换为VBA空日期,但这只有在我真正得到.NET空日期时才起作用。当我得到一个略高于这个值的日期时(例如
0001-01-02T00:00:00
),我又遇到了同样的问题


我知道VBA中的空日期是1899年12月30日,我知道我可以使用
CDate
函数在空日期之前创建日期,但在我看来,我不能低于100岁,或者我可以吗?

是的,1.1.100似乎是VBA中的某种限制

在内部,日期存储为双精度值,因此您可以通过在双精度变量中计算日期,然后将其复制到日期变量,从而强制较早的日期,如下所示:

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

Excel日期并不打算追溯到很久以前,但是您可以使用整数(甚至文本)根据所需的特定时间段创建自己的逻辑编号系统。更多信息。谢谢,我不使用Excel,我使用Access。我在一个代码模块中得到这个日期,当有日期时,我需要在表单上显示它;任何解决方案的基础将适用于任何Office应用程序。。您找到的任何用于处理Excel日期/时间的资源也将应用于MS Access。(Excel还有很多内容。)由于VB6也被标记为这个问题,通常日期控件(activeX文件)通常具有最小日期值的属性设置以及显示日期的格式。例如,控件的默认最小日期值可能默认为12/30/1899,我认为它可以设置为01/01/0000,但这取决于控件。我不知道这是否有帮助。Windows中的Y2K问题解决方案是使用nn30。在nn30之前向下取整,在nn31+之前向上取整。