Excel VBA Range.Finddate这是一个公式

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

在此工作簿中,一张表包含有关处理错误的信息。 它看起来像这样:

截图

(编辑团队成员的用户ID)

正如你所看到的,每个date都是由一个合并的1×3范围表示的,其格式为"dd-mmm"例如“01-Jun”

但是,该date值实际上是通过具有相同布局的另一张表格中的公式拉取的。 一个这样的范围的公式为: ='QA Scores'!K2:M2

我试图使用Range.Findfind同月的第一天和结束date(基于用户input) – 例如6月1日至6月15日 – 但无济于事。 以下是这个样子:

 Set rngMin = .Find(What:=DateValue(minDate), _ LookIn:=xlFormulas, _ LookAt:=xlWhole) 

在其他用途​​中,我以这种方式确定了一个date,但是从公式中提出的价值增加的复杂性似乎是这里的问题。

我已经搜寻了通常的资源,并尝试了我所见过的所有build议。 真的希望这里有人知道一些事情。

更新:
我根据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 

date使用Range.Find方法很难find。 其中一个问题是,在VBA中,date是Date数据types,但是工作表没有那个数据types。 而数据types是一个格式化看起来像date的数字。

一种解决scheme是,如果您可以确定工作表上date的格式,则searchstring等效项。 给你的例子,这样的事情将工作:

 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 

但是由于在许多情况下用户可以改变格式,所以它不是很健壮。

另一种更健壮的方法是遍历现有的单元格,查找date的数字表示(使用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 

如果你有一个很大的search范围,可以将这个范围读入一个VBA数组并循环访问这个数组。

@KOstvall ,,我想build议这个简单的查找方法,因为你正在试图获取date。

设置rng = Sheet1.Range(“A:A”)。Find(“1/1/2017”,LookIn:= xlValue,LookAt:= xlWhole)

更新:我修改了下面的代码来设置查找之前的活动单元格。 第二个animationGIF显示代码正在运行

一种方法是根据特定的date格式进行查找,在您的情况下,查找格式为"[$-en-US]dd-mmm;@" 。 以下是一个简单的例子,您可以根据需要进行调整。 为了使这个例子工作,将3个date放在“A1:A3”,只有其中一个具有所需的格式,然后运行macros。 GIFanimation显示如何设置格式。

在这里输入图像说明

 Sub dateFormatFind() Dim sh As Worksheet, searchR As Range Dim cell As Range, resultR As Range Set sh = Worksheets("Sheet5") Set searchR = sh.Range("A1:A3") Set resultR = sh.Range("C1") sh.Range("A1").Activate Application.FindFormat.NumberFormat = "[$-en-US]dd-mmm;@" resultR = searchR.Find(What:="", After:=ActiveCell, _ LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, _ SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=True) End Sub 

在这里输入图像说明