【发布时间】:2018-08-02 04:14:50
【问题描述】:
似乎 VBA 在 Excel 2016/2013 中发生了变化,就它开始在 Excel 2010 上不会抛出的地方抛出错误而言。
以下代码执行以下操作:
- 在 ActiveSheet 的第一行中创建 17 个日期;
- 用 4 个值填充日期数组
- 第一行中的一个
- 一个不在第一行
- 1913年的一个
- 1904 年之前的一个
- 它会查找每个值,如果找到,则将单元格涂成红色;
在 Excel 2010 中,它运行平稳,找到了一个值,而没有按预期找到其他 3 个值。一切正常。
在 Excel 2016/2013 中,它对 1904 之前的值不满意并抛出错误
无效的过程调用或参数(错误 5)
在Set foundRange = Rows(1).Find(someDates(cnt)) 上。
因此,似乎在 Excel 2016/2013 中的 Date1904 规则下,进行了某种检查,即 04.01.1900 在 1904 之前,因此无法解析为日期在 Excel 日期系统中?而在 Excel 2010 中并非如此。
所以问题 - 此功能/行为是否记录在案?
Public Sub TestMe()
ThisWorkbook.Date1904 = True
Cells.Clear 'clearing up all.
Dim cnt As Long
For cnt = 3 To 20
Cells(1, cnt) = DateAdd("M", cnt, DateSerial(2016, 1, 1))
Cells(1, cnt).NumberFormat = "MMM-YY"
Next cnt
Dim someDates(3) As Date
someDates(0) = DateSerial(2016, 1, 1) 'exists
someDates(1) = DateSerial(2012, 1, 1) 'does not exist in the range
someDates(2) = 5000 '08.09.1913 (in VBA)
someDates(3) = 5 '04.01.1900 (in VBA)
Dim foundRange As Range
For cnt = LBound(someDates) To UBound(someDates)
Set foundRange = Rows(1).Find(someDates(cnt)) 'Error 5 in Excel 2016
If Not foundRange Is Nothing Then
foundRange.Interior.Color = vbRed
End If
Next cnt
ThisWorkbook.Date1904 = False 'all dates with 4 years back
End Sub
为什么在搜索 2016 年 1 月时选择 2016 年 11 月:
【问题讨论】:
-
此处观察相同(在 Excel 2007 中工作正常,在 Excel 2016 中引发错误)。顺便说一句,为什么 Find 返回
someDates(0)的单元格? -
回答您的问题:不,我认为这没有明确记录。顺便说一句,这个问题也出现在 Excel 2013 中。就我个人而言,我总是避免使用 VBA 日期数据类型的日期雷区,Range.Value 的相关隐式转换以及相当有问题的 .Find 并坚持将日期视为双精度并使用 .value2跨度>
-
@Vityata 我可能遗漏了一些东西,你能开发吗?在我的电脑上,代码为 J1 单元格着色,日期为 2016 年 11 月。即使有 4 年的偏移量,也不应该“找到”这个单元格。 Find 是否使用字符串来比较日期并搞砸 11/1/2016 和 1/1/2016?我原以为它会比较数值。
-
运行时错误 5“无效的过程参数”也很明显,因为
ThisWorkbook.Date1904 = True5 = 1900-01-04 不是日期。第一个日期是 0 = 1904-01-01。 -
对不起,我想我误解了。我的坏 - 文字可能很糟糕。 (我哥哥和我曾经因为连字符缺失而有 6 个月没有说话。“我重新发送了那封电子邮件”变成了“我重新发送了那封电子邮件。”...