3

我正在尝试使用.Find.FindNext搜索单列数据。我首先需要找到包含值“Total”的第一个单元格。我试图到达的单元格是“总计”单元格之后的第三个单元格,其中包含值“技术”。可以肯定的是 Cells(1, 1) 不包含“Tech”或“Total”。

Dim FirstTotal As Range
Dim SearchRng As Range
Dim ResultRng As Range
Set SearchRng = Range("A:A")

Set FirstTotal = SearchRng.Find(What:="Total", After:=Cells(1, 1), SearchDirection:=xlNext)
Set ResultRng = SearchRng.Find(What:="Tech", After:=FirstTotal, SearchDirection:=xlNext)
SearchRng.FindNext().Activate
SearchRng.FindNext().Activate

在我运行此代码的大约 50% 的时间里,我被以Set ResultRng =. 其余时间,代码一直运行,但结果看起来好像最后两行代码被完全忽略了。

我怀疑这里的答案非常基本,但我对 excel vba 还是很陌生,到目前为止我发现没有任何资源可以回答这个问题。请帮忙!

4

2 回答 2

1

Would this help?

Topic: .Find and .FindNext In Excel VBA

Link: http://www.siddharthrout.com/2011/07/14/find-and-findnext-in-excel-vba/

Extract From the link:

Sub Sample()
    Dim oRange As Range, aCell As Range, bCell As Range
    Dim ws As Worksheet
    Dim ExitLoop As Boolean
    Dim SearchString As String, FoundAt As String
    On Error GoTo Err
    Set ws = Worksheets("Sheet3")
    Set oRange = ws.Columns(1)

    SearchString = "2"
    Set aCell = oRange.Find(What:=SearchString, LookIn:=xlValues, _
                LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
                MatchCase:=False, SearchFormat:=False)
    If Not aCell Is Nothing Then
        Set bCell = aCell
        FoundAt = aCell.Address
        Do While ExitLoop = False
            Set aCell = oRange.FindNext(After:=aCell)

            If Not aCell Is Nothing Then
                If aCell.Address = bCell.Address Then Exit Do
                FoundAt = FoundAt & ", " & aCell.Address
            Else
                ExitLoop = True
            End If
        Loop
    Else
        MsgBox SearchString & " not Found"
    End If
    MsgBox "The Search String has been found at these locations: " & FoundAt
    Exit Sub
Err:
    MsgBox Err.Description
End Sub
于 2012-06-11T22:13:05.033 回答
1

如果未找到“Total”,则 FirstTotal 将为 Nothing,当您尝试将 FirstTotal 用于 ResultRange Find(第 2 行)中的“After”参数时,这将导致类型不匹配。这将防止该错误:

Set FirstTotal = SearchRng.Find(What:="Total", After:=Cells(1, 1), SearchDirection:=xlNext)
If Not FirstTotal is Nothing Then
   Set ResultRng = SearchRng.Find(What:="Tech", After:=FirstTotal, SearchDirection:=xlNext)
End If

一般来说,任何依赖的 Find 都需要以这种方式处理。

显然,这里需要某种 Else 语句,但我不知道那会是什么。

于 2012-06-11T20:14:12.903 回答