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

时间:2015-05-25 15:01:56

标签: excel vba excel-vba

所以当我尝试在VBA中编程时,我在微软网站(https://msdn.microsoft.com/en-us/library/office/ff839746.aspx)上发现了这个

表达式.Find(What,After,LookIn,LookAt,SearchOrder,SearchDirection,MatchCase,MatchByte,SearchFormat) expression表示Range对象的变量。

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

我想让我的代码找到第一个带有" Date"数据类型在一定范围内,临时。

Dim temp As Range, next_date As Range
temp = Range("A63:A70")
Set next_date = temp.Find(Date)
Debug.Print (next_date)

但是我一直没有设置"对象变量"错误,我认为这意味着它无法在范围内找到日期。该范围内肯定有一个日期,但当我将鼠标悬停在" Date"我键入了.Find(),我意识到它显示了今天的日期。

我认为此代码可能会尝试查找今天的范围内的日期。但我只是想让它找到一个带有通用" Date"数据类型,有没有办法在不指定具体日期的情况下执行此操作?谢谢!

3 个答案:

答案 0 :(得分:2)

我不确定您是否可以使用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

答案 1 :(得分:0)

temp是一个对象Range。您必须使用set - > What does the keyword Set actually do in VBA?

我认为您无法使用.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

答案 2 :(得分:0)

问题不在于'在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确实有IsDate Function。这可能会考虑a)值的数值性质,b)Range.Value和Range.Value2之间的差异,以及c)确定单元格值是否为 42,149 或<的单元格的数字格式EM> 25可能 - 2015 。但是,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个细胞,所以一个循环不会对性能产生过分的损害,但它肯定会减慢几千个细胞的速度,无法单独检查。