Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 范围。查找公式日期_Vba_Excel_Date - Fatal编程技术网

Vba 范围。查找公式日期

Vba 范围。查找公式日期,vba,excel,date,Vba,Excel,Date,我收到一份工作簿,其中包含有关呼叫中心团队处理量的信息。我无法修改工作簿的格式或布局 一页包含有关处理错误的信息。 (团队成员的用户ID已编辑) 每个日期由合并的1x3范围表示,所述日期格式为“dd mmm”,例如“01 Jun” 该日期通过公式从具有相同布局的另一张图纸中提取。其中一个范围的公式如下:='QA分数'!K2:M2 我尝试使用Range.Find查找给定月份的第一天和该月份的结束日期(基于用户输入)-例如6月1日到6月15日 Set rngMin=.Find(What:=Date

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

一页包含有关处理错误的信息。

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

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

该日期通过公式从具有相同布局的另一张图纸中提取。其中一个范围的公式如下:
='QA分数'!K2:M2

我尝试使用
Range.Find
查找给定月份的第一天和该月份的结束日期(基于用户输入)-例如6月1日到6月15日

Set rngMin=.Find(What:=DateValue(minDate)_
LookIn:=xl公式_
注视:=xlother)
在其他用途中,我以这种方式定位日期,但公式值的复杂性增加似乎是这里的问题

更新:
我根据罗恩·罗森菲尔德的回答写了以下内容:

Dim usedar作为变量:usedar=SrcWS.UsedRange
blFound=False
对于i=LBound(usedar,1)到UBound(usedar,1)
对于j=LBound(usedar,2)到UBound(usedar,2)
如果Usedar(i,j)=MinDate,则
blFound=True
退出
如果结束
下一个
如果blFound=True,则退出
下一个

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

一种方法是基于特定的日期格式进行查找,在您的情况下,该格式似乎是
“[$-en-US]dd mmm;@”
。下面是一个简单的示例,您可以根据需要进行调整。要使此示例起作用,请将3个日期放入“A1:A3”,其中只有一个具有所需格式,然后运行宏。动画gif显示如何设置格式


@KOstvall,,我建议您使用这种简单的查找方法,因为您正在尝试获取日期


设置rng=Sheet1.范围(“A:A”).查找(“2017年1月1日”,LookIn:=xlValue,LookAt:=xlother)

使用
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
但它不是很健壮,因为在许多情况下,用户可以更改格式

另一种更稳健的方法是循环现有单元格,查找日期的数字表示形式(使用
Value2
属性):


如果要搜索的范围很大,可以通过将范围读入VBA数组并在数组中循环来将搜索速度提高十倍。

在使用
查找日期时也遇到了同样的问题。即使搜索的目标日期格式为
dd-mmm
也要使用
d-mmm
格式进行查找

Date_Value = Application.Text(Date_Value, "d-mmm-yy") 'Use Format for your case

Set r_gt= .Range(EODate_Range).Find(Date_Value, LookIn:=xlValues)
注:如果目标日期格式为
dd-mm-yy
,则必须循环遍历单元格。
将搜索格式更改为
d-mm-yy
/
d-m-yy
后,尝试了上述
01-01-20
代码,但找不到日期,但如果单元格格式更改为
01-Jan-20

范围,则会找到日期。find
会在调用之间保留其可选参数,这是一种容易出现错误的恶劣行为;确保每次都指定所有参数,以避免它咬到您。如果您想找到公式的表达式,
xlValues
正确的方法不是吗?@Mat'sMug感谢您提供的信息。在这种情况下,这不是一个问题,但很好地了解未来@DirkReichel遗憾的是,没有。
xlValues
只检查工作表上显示内容的
.Text
属性。使用
xlValues
搜索
格式(DateValue(minDate),“[$-en-US]dd-mmm”)
也不起作用?奇怪的是,没有,这不起作用。这实际上表明,
xlValues
查看的不仅仅是
.Text
属性……当我尝试按照上面所述设置FindFormat时,出现了一个通用错误1004。感谢您指出这一点。也许是因为我在运行代码时激活了A1单元,而你没有激活。无论如何,我现在修改了代码以确保不会发生这种情况,并提供了一个动画gif来显示代码正在运行。不,这不起作用,因为在这种情况下,
xlFormulas
值是公式而不是日期。这有助于您查找日期。私有子Finddate()Dim dateval,Dim Date row,Dim DateCol dateval=Range(“A8”).值单元格.Find(What:=dateval,After:=ActiveCell,LookIn:=xlValues,LookAt:=xlPart,SearchOrder:=xlByRows,SearchDirection:=xlNext,MatchCase:=False,SearchFormat:=False).Activate DateRow=ActiveCell.Row DateCol=ActiveCell.Column MsgBox(DateRow&&&&DateCol)End SubYes,第二种方法非常可靠,尤其是在您的情况下。我不明白为什么,但第一种方法不起作用。然而,第二种方法确实如此。我已经将我为此编写的代码添加到我的原始帖子中。谢谢
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
Date_Value = Application.Text(Date_Value, "d-mmm-yy") 'Use Format for your case

Set r_gt= .Range(EODate_Range).Find(Date_Value, LookIn:=xlValues)