VBA识别/默认为哪个日期系统?

时间:2019-01-31 13:36:28

标签: excel vba date

我正在用excel编写vba子例程,以将两个日期之间的所有日期值存储在一个维数组中,然后检查另一张纸上某个范围内的每个值。

我的问题是,当代码获取日期值(作为整数(或双精度数-实际使用的那个双精度数))时,它在表上存储的日期值大于1462。

我正在使用1904年日期系统,所以我可以使用负时间值,而且我在澳大利亚,所以日期的格式为dd / mm / yyyy。

  

作为一个例子;

     

在工作表上:   01/01/2019 = 42004

     

代码中:01/01/2019 = 43466

我了解,差异与使用1900年与1904年日期系统时的日期值之间的差异相同,这使我相信VBA可能会将工作表值默认为1900年,并且当代码将其再次转换为1904年时运行吗?

此工作簿的设置如下:

  

Sheet1Range("A1:A25")中包含从01/01/2019到25/01/2019的日期。

     

Sheet2包含A1单元格中的01/01/2019和A2单元格中的10/01/2019和一个activeX commandbutton

和代码:

Private Sub CommandButton1_Click()
Dim myStart As Long
Dim myEnd As Long

myStart = Me.Range("A1").Value
myEnd = Me.Range("A2").Value

Dim v As Variant
Dim x As Long
Dim myArr As Variant
ReDim myArr(0 To 100)
x = 0

For v = myStart To myEnd
    If v = Empty Then Exit For
    myArr(x) = v
    Debug.Print ("v = " & v)
    Debug.Print ("myArr = " & myArr(x))
    x = x + 1
Next

Dim lastrow As Long
lastrow = Me.Cells(Rows.Count, 4).End(xlUp).Row
x = 0
For Each cell In Sheet1.Range("A1:A100")
Debug.Print (CDbl(cell))
    If cell = myArr(x) Then
        Me.Cells(lastrow, 3).Value = cell
        Me.Cells(lastrow, 4).Value = Format(cell, "dd/mm/yyyy")
        lastrow = lastrow + 1
    End If
    x = x + 1
Next
End Sub

第3列和第4列中cell值的输出如下(用于演示的前5行):

       C         D             Sheet1.Range("A1:A5")[when displayed as number format] 
1    43466    01/01/2019                42004
2    43467    02/01/2019                42005
3    43468    03/01/2019                42006
4    43469    04/01/2019                42007
5    43470    05/01/2019                42008

日期以短日期格式而非数字值的形式写入单元格。

使用一个令人生畏的窗口,我注意到?cdbl(DateValue(now)) = 43496 (31/01/2019)使我想知道使用1904年日期系统的日期哪个值正确?根据Sheet1中的值,该值应为42034

是由我使用的数据类型或函数引起的问题吗?是否如先前所质疑的那样?当使用VBA将值分配给Sheet2时,工作表会将其转换为1904,是否是excel的错误或其他原因?

我找到了一个与问题here on mrexcel相同的问题,但是解决方案将Excel更改为使用1900日期系统或从代码中的值中减去1462,我希望避免两者同时出现。 >

2 个答案:

答案 0 :(得分:5)

通常,VBA中的日期系统与Excel中的日期系统不同。您可以使用以下3个日期系统选项:

  • Excel日期
  • 具有1904年属性的Excel日期
  • VBA日期

这是区别:

日期将转换为数字。例如,每个日期都会转换为数字,但起始数字会有所不同。

  • 在Excel中, 1 转换为 1900年1月1日
  • 在VBA中, 1 转换为 1899年12月31日
  • 在具有1904年版本的Excel中, 1 转换为 1904年1月2日

根据工作簿设置1904系统(或缺少1904系统)。因此,如果您在Excel中有2个工作簿,一个带有1904年,另一个没有,则它将相应地识别它们。系统设置在:

文件>选项>高级>使用1904年日期系统

enter image description here

通常,如果有机会有人用错误的系统更改了您的工作簿,请考虑在工作簿开头处添加此检查:

Private Sub Workbook_Open()    
    If ThisWorkbook.Date1904 Then
        MsgBox "System is 1904, consider some action!"
    End If        
End Sub

如果您想选择哪种系统-我可以不建议您使用1904。

答案 1 :(得分:0)

为我的示例提供解决方案,一位同事提到,如果您将日期值设为date数据类型,则值变为工作表-> vba->工作表的问题消失了。