Range.Find 是一个公式的日期

KOs*_*oll 3 excel vba date

我收到一份工作簿,其中包含有关呼叫中心团队处理量的信息。我无法修改上游工作簿的格式或布局。

一张纸包含有关处理错误的信息。
截屏
(已编辑团队成员的用户 ID)

每个日期由合并的 1x3 范围表示,相关日期格式为“dd-mmm”,例如“01-Jun”

该日期是通过公式从另一个具有相同布局的工作表中提取的。一个这样的范围的公式如下:='QA Scores'!K2:M2

我试图用来Range.Find定位给定月份的第一天和同月的结束日期(根据用户输入)——例如 6 月 1 日到 6 月 15 日。

Set rngMin = .Find(What:=DateValue(minDate), _
                   LookIn:=xlFormulas, _
                   LookAt:=xlWhole)
Run Code Online (Sandbox Code Playgroud)

在其他用途​​中,我以这种方式定位日期,但来自公式的值的增加的复杂性似乎是这里的问题。

更新:
我根据 Ron Rosenfeld 的回答写了以下内容:

Dim UsedArr As Variant: UsedArr = SrcWS.UsedRange
blFound = False
For i = LBound(UsedArr, 1) To UBound(UsedArr, 1)
    For j = LBound(UsedArr, 2) To UBound(UsedArr, 2)
        If UsedArr(i, j) = MinDate Then
            blFound = True
            Exit For
        End If
    Next
    If blFound = True Then Exit For
Next
Run Code Online (Sandbox Code Playgroud)

Ron*_*eld 7

使用该Range.Find方法很难找到日期。问题之一是在 VBA 中,日期属于Date数据类型,但工作表没有该数据类型。而是数据类型是格式化为看起来像日期的数字。

如果您可以确定工作表上日期的格式,一种解决方案是搜索等效字符串。鉴于你的例子,这样的事情会起作用:

Option Explicit
Sub GetDates()
    Const findDate As Date = #5/11/2017#
    Dim findStr As String

Dim R As Range, WS As Worksheet
Set WS = Worksheets("Sheet1")

findStr = Format(findDate, "dd-mmm")

With WS
    Set R = .Cells.Find(what:=findStr, LookIn:=xlValues, lookat:=xlWhole)
    If Not R Is Nothing Then MsgBox findDate & " found in " & R.Address
End With

End Sub
Run Code Online (Sandbox Code Playgroud)

但它不是很健壮,因为在许多情况下,用户可以更改格式。

另一种更强大的方法是遍历现有单元格,查找日期的数字表示(使用Value2属性):

Sub GetDates2()
    Const findDate As Date = #5/11/2017#
    Dim R As Range, C As Range, WS As Worksheet

Set WS = Worksheets("sheet1")
Set R = WS.UsedRange

For Each C In R
    If C.Value2 = CDbl(findDate) Then MsgBox findDate & " found in " & C.Address
Next C
End Sub
Run Code Online (Sandbox Code Playgroud)

如果您要搜索的范围很大,则可以通过将范围读入 VBA 数组并循环遍历数组来将搜索速度提高 10 倍。