excel 范围,在作为公式的日期上查找

sirbozc5  于 2023-02-05  发布在  其他
关注(0)|答案(5)|浏览(181)

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

(team成员的用户ID已修订)
每个日期由合并的1x3范围表示,相关日期格式为"日-月",例如"01-Jun"
该日期通过公式从具有相同布局的另一个工作表中提取。其中一个范围的公式如下:='QA Scores'!K2:M2
我尝试使用Range.Find来定位给定月份的第一天和同一个月的结束日期(基于用户输入)-例如,从6月1日到6月15日。

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

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

    • 更新日期:**

根据罗恩·罗森菲尔德的回答,我写了下面这段话:

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
dpiehjr4

dpiehjr41#

使用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属性):

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

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

zujrkrfu

zujrkrfu2#

@KOstvall,,我想建议这个简单的查找方法,因为你正在尝试获得日期.
设置rng =工作表1.范围(“A:A”).查找(“2017年1月1日”,查找范围:= xl值,查找位置:= xl整个)

vnjpjtjt

vnjpjtjt3#

在使用.find作为日期时也遇到了同样的问题。即使搜索的目标日期格式是dd-mmm,也要使用d-mmm的.find。

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)

PS:如果目标日期格式是dd-mm-yy,你必须循环遍历单元格。在将搜索格式更改为d-mm-yy/d-m-yy后,尝试了01-01-20的上述代码,但未能找到日期,但如果单元格格式更改为01-Jan-20,它会找到日期。

oprakyz7

oprakyz74#

要搜索日期,首先要将其保存在一个String变量中,并将其格式设置为"Short Date",然后通过将其转换为日期来获取Find变量。
这个函数非常通用,但很容易适应任何问题。在标准模块中编写函数及其调用。在ActiveSheet中,以您想要的格式(例如25-dic-23)编写日期25/12/2023,然后启动DateFind_Call调用

Option Explicit

Public Function DateFind(ByVal shSheet_I As Worksheet, ByVal dDate_I As Date) As String
    DateFind = ""
    Dim StrDate As String
    StrDate = Format(dDate_I, "Short Date")
    
    Dim DateCell As Range
    Set DateCell = shSheet_I.Cells.Find( _
        What:=CDate(StrDate), _
        After:=Range("A1"), _
        LookIn:=xlFormulas, _
        SearchOrder:=xlByRows, _
        SearchDirection:=xlNext, _
        MatchCase:=False, _
        LookAt:=xlWhole)
    If Not DateCell Is Nothing Then
        DateFind = DateCell.Address(False, False)
    End If
End Function

Sub DateFind_Call()
    Dim MyDate As String
    MyDate = DateFind(ActiveSheet, CDate("25/12/2023"))
    If MyDate <> "" Then
        MsgBox "Date found in range: """ & MyDate & """"
    Else
        MsgBox "Date not found"
    End If
End Sub

访问https://www.ozgrid.com/VBA/find-dates.htm了解更多详情。

gg58donl

gg58donl5#

更新:我修改了下面的代码,在find之前设置活动单元格。第二个动画gif显示代码正在运行
一种方法是根据特定的日期格式进行查找,在您的情况下,该格式显示为"[$-en-US]dd-mmm;@"。下面是一个简单的示例,您可以根据需要进行调整。要使此示例工作,请将3个日期放入“A1:A3”中,其中只有一个具有所需的格式,然后运行宏。动画gif显示了如何设置格式。

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

相关问题