如何在VBA中使用.Find查找特定的数据类型?

如何在VBA中使用.Find查找特定的数据类型?,vba,excel,Vba,Excel,当我试图用VBA编程时,我在微软网站()上找到了这个 expression.Find(What、After、LookIn、LookAt、SearchOrder、SearchDirection、MatchCase、MatchByte、SearchFormat) 表达式表示范围对象的变量 内容:要搜索的数据。可以是字符串或任何Microsoft Excel数据类型 我希望我的代码能找到第一个数据类型为“Date”的单元格,在一定范围内,temp Dim temp As Range, next_dat

当我试图用VBA编程时,我在微软网站()上找到了这个

expression.Find(What、After、LookIn、LookAt、SearchOrder、SearchDirection、MatchCase、MatchByte、SearchFormat) 表达式表示范围对象的变量

内容:要搜索的数据。可以是字符串或任何Microsoft Excel数据类型

我希望我的代码能找到第一个数据类型为“Date”的单元格,在一定范围内,temp

Dim temp As Range, next_date As Range
temp = Range("A63:A70")
Set next_date = temp.Find(Date)
Debug.Print (next_date)
但是我一直得到“objectvariablennotset”错误,我认为这意味着它无法找到范围内的日期。这个范围内肯定有一个日期,但当我将鼠标移到我在.Find()中键入的“日期”上时,我意识到它显示的是今天的日期


我认为这段代码可能试图在范围内查找今天的日期。但我只想让它找到一个具有通用“Date”数据类型的单元格,有没有办法在不指定特定日期的情况下做到这一点?谢谢

我不确定您是否可以使用
Find()
查找任何日期类型的值。我认为您需要指定您正在搜索的实际日期。例如:

Set FoundCell = Range("A1:A10").Find (what:="7/18/1998")
另一个选项是简单循环:

Sub FindNextDate()
    Dim val As Range

    For Each val In Range("A1:A10")
        If IsDate(val) Then
            Debug.Print "Date: " & val & " found at cell: " & val.Address
            Exit Sub
        End If
    Next val
End Sub

temp
是一个对象
范围
。您必须使用
set
->

我认为您无法使用
.find()
查找数据类型,但是,您可以尝试使用find格式,这表明我们正在处理日期:

Sub tt()

Dim temp As Range, next_date As Range
Set temp = Range("A60:A70")

Application.FindFormat.NumberFormat = "m/d/yyyy"

Set next_date = temp.Find("", SearchFormat:=True)

Debug.Print next_date
Debug.Print next_date.Address

End Sub

问题不在于“A63:A70中有日期吗?”而是“A63:A70中还有什么?”。日期实际上不是一种单独的值类型。对于大多数意图和目的(稍后将详细介绍),它们被视为数字。如果您只想在包含日期、文本、空格但不包含其他数字的范围内找到第一个日期类型,那么这就可以了

    Dim temp As Range
    On Error Resume Next
    Set temp = Range("A63:A70").SpecialCells(xlCellTypeConstants, xlNumbers)
    If Not temp Is Nothing Then
        Set temp = temp.Cells(1, 1) 'reset temp to the 1st date if there are more than one
        Debug.Print temp.Address
    Else
        Debug.Print "no date in range"
    End If
我之所以说大多数意图和目的是因为VBA有一个。这可能考虑a)值的数字性质,b)Range.value和Range.value之间的差异2和c)单元格的数字格式,以确定单元格值是42149还是2015年5月25日。但是,IsDate函数一次只能检查一个单元格,因此需要通过单元格进行耗时的循环

    Dim temp As Range
    For Each temp In Range("A63:A70")
        If IsDate(temp) Then Exit For
    Next temp
    If Not temp Is Nothing Then
        Debug.Print temp.Address
    Else
        Debug.Print "no date in range"
    End If

您的示例只有8个单元,因此循环不会对性能造成太大的损害,但如果有几千个单元单独检查,肯定会减慢速度。

关于循环性能的好观点-我在回答中考虑了这一点,即,如果只有小范围,则循环是好的,但对于大数据集,则不会如此很好,谢谢你的回答!我意识到我误读了“可以是字符串或任何Microsoft Excel数据类型”——我原以为是这样。Find可用于查找特定的数据类型,但我现在意识到它的意思。Find可用于查找特定字符串、数字、日期或其他Excel数据类型的任何其他数据。我希望避免循环,因为我实际上要处理数百行(但在示例中没有指定),但我可能会使用您的答案,Jeeped!还感谢Alex P和Dawid提供的有用信息