【发布时间】:2018-08-02 14:03:27
【问题描述】:
假设我有以下琐碎的任务:
- 连续写下从 2016 年 1 月到 2018 年 6 月的月份中的第一个日期
- 找到 01-January-2016 并将其涂成红色
- 使用
Range.Find()
因此,我创建了一个代码,从 1 循环到 30 并写入每个月的第一个日期。然后我使用Rows(1).Find(CDate("01.01.2016")) 或Rows(1).Find(DateSerial(2016,1,1)),我认为我的任务几乎准备好了。
我运行代码,我在 Excel 2010 和 Excel 2016 中都看到了这一点:
问题:
这背后有什么原因吗?或者Range.Find() 函数是否记录为这样?
Public Sub TestMe()
Cells.Clear
Dim cnt As Long
For cnt = 1 To 30
Cells(1, cnt) = DateAdd("M", cnt - 1, DateSerial(2016, 1, 1))
Cells(1, cnt).NumberFormat = "MMM-YY"
Next cnt
Dim foundRange As Range
Set foundRange = Rows(1).Find(CDate("01.01.2016"))
'Set foundRange = Rows(1).Find(DateSerial(2016, 1, 1)) 'the same false result
'Set foundRange = Rows(1).Find("01.01.2016") 'does not find anything
If Not foundRange Is Nothing Then
foundRange.Interior.Color = vbRed
End If
End Sub
一般来说,Range.Find() 有一个可选的After 参数,它是Range 的第一个单元格。在我们的例子中,After 参数被省略,因此它被认为是A1 并且最后被检查。如果您在第一次循环后停止代码并从 Excel 中手动删除 Nov 16,然后继续执行代码,它将以红色返回单元格 Jan 16。
只要 11 月被认为已找到,它就会将其归还,并且不会更进一步。问题更像是 - 2016 年 11 月 1 日 与 2016 年 1 月 1 日 相同,甚至部分相同的逻辑是什么?
【问题讨论】:
-
Set foundRange = Rows(1).Find(DateSerial(2016, 1, 1), [A1], , xlWhole) -
这是一个完整的猜测。美国日期格式
1/1/2016可以在11/1/2016中找到。 -
@FlorentB。 -
LookAt:=xlWhole与搜索开始无关。尝试写Set foundRange = Rows(1).Find(DateSerial(2016, 1, 1), after:=Range("AD1")),它会给出预期的结果。 -
@CallumDA - 这很有意义,但是然后
1/1/2016也可以在21/1/2016中找到。如果您只更改第一个循环中的代码,如Cells(1, cnt) = DateAdd("M", cnt - 1, DateSerial(2016, 1, 21)),那么它应该会找到一些东西。它什么也没找到。 -
@Vityata 再次猜测,请记住,在 vba 中,日期将以 EN-US 格式查看。我相信您在查看 2016 年 1 月 11 日时也会返回 2016 年 11 月 11 日。如在 EN-US 中,分别为
11/11/2016和1/11/2016。