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

Sam*_*son 3 excel vba date

我在excel中编写了一个vba子例程,用于存储单个维度数组中两个日期之间的所有日期值,然后检查另一个工作表中某个范围内的每个值.

我的问题是当代码抓取日期值时(作为一个整数(或双倍 - 无论它实际使用的是什么))它存储的值1462大于工作表上的日期值.

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

举个例子;

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

在代码中:01/01/2019 = 43466

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

此工作簿设置如下:

Sheet1包含日期:01/01/2019至25/01/2019 in Range("A1:A25").

Sheet2包含01/01/2019 in cell A1和10/01/2019 in cell A2和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
Run Code Online (Sandbox Code Playgroud)

cell3列和第4列中值的输出如下(前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
Run Code Online (Sandbox Code Playgroud)

日期作为短日期格式写入单元格而不是数值.

使用威吓窗口我注意到?cdbl(DateValue(now)) = 43496 (31/01/2019)哪个让我想知道使用1904日期系统的日期哪些值是正确的?根据Sheet1中的值,它应该是42034.

这个问题是由我使用的数据类型或函数引起的,如前所述 - 当使用VBA将值分配给Sheet2时,工作表将它们转换为1904,是excel还是其他的错误?

在mrexcel上找到了一个同样问题的问题,但是那里的分辨率改变了Excel以使用1900日期系统或从代码中的值中减去1462,我希望避免这两者.

Vit*_*ata 5

通常,VBA中的日期系统与Excel中的日期系统不同.您可以拥有以下3个日期系统选项:

  • Excel日期
  • Excel日期与1904年属性
  • VBA日期

这是不同的:

日期将转换为数字.例如,每个日期都转换为数字,但起始编号有点不同.

  • 在Excel中,1将转换为01.January.1900 ;
  • 在VBA中,1转换为31.December.1899 ;
  • 在1904年的Excel中,1将转换为02.January.1904 ;

1904系统(或其缺乏)是根据工作簿设置的.因此,如果您在Excel中有2个工作簿,一个有1904而另一个没有它,它会相应地识别它们.系统设置为:

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

在此输入图像描述

通常,如果有可能某人以某种方式使用错误的系统更改您的工作簿,请考虑在打开工作簿时添加此检查:

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

如果您想知道选择哪个系统 - 我建议不要使用1904.