我在Excel中写VBA子程序来存储2个日期之间的所有日期值在一个一维数组,然后检查在另一片的范围内的每个值。
它被存储比片上的日期值更大的值1462 - 当代码敛日期值(它实际上是用哪一个)为整数(或双)我的问题是。
我使用的是1904日期系统,所以我可以使用负的时间值,我在澳大利亚这样的日期格式DD / MM / YYYY。
举个例子;
在片材:2019年1月1日= 42004
中的代码:2019年1月1日= 43466
我理解其使用使我相信也许VBA是默认的表值是在1900年和转换时再次运行代码的价值到1904年1900对1904日期系统时,所不同的是一样的日期值之间的差异?
该工作簿被设置如下:
Sheet1
包含从2019年1月1日至Range("A1:A25")
25/01/2019日期。
Sheet2
包含在细胞A1
2019年1月1日和2019年10月1日在细胞A2
and一个的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中的cell
值和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
。
被这个问题所造成的,我使用的数据类型或函数,它是如前面质疑 - 纸张将它们转换为1904,当值分配到Sheet2用VBA,它是用Excel或者别的什么错误?
我发现同样的问题here on mrexcel一个问题,不过分辨率有变化Excel中使用1900日期系统或从代码,我希望能避免两者的值减去1462。
一般来说,在VBA日期系统比在Excel中日期系统不同。您可以把这3日系统选项:
这就是区别:
日期将被转换成数字。例如,每日期被转换为一个数字,而是起始号码是有点不同。
1904系统(或其缺乏)是每工作簿设置。因此,如果你有2个工作簿在Excel中,一个与1904年,一个没有它,它会相应地识别它们。该系统被设置在:
文件>选项>高级>使用1904日期系统
在一般情况下,如果有机会的话,有人莫名其妙地与错误的系统更改工作簿,考虑在工作簿的开通增加此项检查:
Private Sub Workbook_Open()
If ThisWorkbook.Date1904 Then
MsgBox "System is 1904, consider some action!"
End If
End Sub
如果你想知道选择哪个系统 - 我从来不推荐使用1904。
> VBA - - >片消失,如果你的价值观去片暗淡的日期值作为date
数据类型的问题提供解决方案,以我的例子同事提及。