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

(已编辑团队成员的用户 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)
使用该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 倍。
| 归档时间: |
|
| 查看次数: |
33108 次 |
| 最近记录: |