我正在用excel编写vba子例程,以将两个日期之间的所有日期值存储在一个维数组中,然后检查另一张纸上某个范围内的每个值。
我的问题是,当代码获取日期值(作为整数(或双精度数-实际使用的那个双精度数))时,它在表上存储的日期值大于1462。
我正在使用1904年日期系统,所以我可以使用负时间值,而且我在澳大利亚,所以日期的格式为dd / mm / yyyy。
作为一个例子;
在工作表上: 01/01/2019 = 42004
代码中:01/01/2019 = 43466
我了解,差异与使用1900年与1904年日期系统时的日期值之间的差异相同,这使我相信VBA可能会将工作表值默认为1900年,并且当代码将其再次转换为1904年时运行吗?
此工作簿的设置如下:
Sheet1
在Range("A1:A25")
中包含从01/01/2019到25/01/2019的日期。
Sheet2
包含A1
单元格中的01/01/2019和A2
单元格中的10/01/2019和一个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列中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,我希望避免两者同时出现。 >
答案 0 :(得分:5)
通常,VBA中的日期系统与Excel中的日期系统不同。您可以使用以下3个日期系统选项:
这是区别:
日期将转换为数字。例如,每个日期都会转换为数字,但起始数字会有所不同。
根据工作簿设置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。
答案 1 :(得分:0)
为我的示例提供解决方案,一位同事提到,如果您将日期值设为date
数据类型,则值变为工作表-> vba->工作表的问题消失了。