我正在 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 inRange("A1:A25")
.
Sheet2
contains 01/01/2019 in cellA1
and 10/01/2019 in cellA2
and a activeXcommandbutton
.
代码:
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 日期系统
一般来说,如果有人有可能以某种方式使用错误的系统更改了您的工作簿,请考虑在工作簿的开头添加此检查:
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/