excel - VBA 识别/默认使用哪种日期系统?

标签 excel vba date

我正在 Excel 中编写一个 vba 子例程,用于将 2 个日期之间的所有日期值存储在一个维度数组中,然后检查另一张工作表上某个范围内的每个值。

我的问题是,当代码获取日期值(作为整数(或 double 值 - 无论它实际使用哪个))时,它存储的值比工作表上的日期值大 1462。

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

As an example;

On the sheet: 01/01/2019 = 42004

In the code: 01/01/2019 = 43466

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

本工作簿的设置如下:

Sheet1 contains dates from 01/01/2019 to 25/01/2019 in Range("A1:A25").

Sheet2 contains 01/01/2019 in cell A1 and 10/01/2019 in cell A2and a 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 列中的单元格值的输出如下(前 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,我希望避免这两种情况。

最佳答案

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

  • Excel 日期
  • 包含 1904 年属性的 Excel 日期
  • VBA 日期

这就是区别:

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

  • 在 Excel 中,1 会转换为 01.January.1900
  • 在 VBA 中,1 转换为 31.December.1899
  • 在包含 1904 的 Excel 中,1 会转换为 02.January.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。

关于excel - VBA 识别/默认使用哪种日期系统?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54461825/

相关文章:

vba - 显示宏正在执行的更新

arrays - 更新与辅助数组匹配的大型数组中的特定值(如 vlookup)

.net - 如何在VB.NET中使用Excel函数?

excel - 如何按 "numerical"顺序对大纲数字进行排序?

excel - 向右排列值

java - 计算闰年中不含 "extra"日期的日期之间的天数

excel - 在图表中使用数组值作为 X 和 Y 值

excel - 从工作表上的单元格获取值

mysql - 按年,月和2个日期字段条件分组

javascript - new Date() vs Date() 为什么返回不同的时间(-2 小时)?