Вопрос по excel-vba, excel, find, next, vba – .FindNext не работает после функции .Find (excel vba)

3

Я пытаюсь использовать.Find а также.FindNext искать через один столбец данных. Сначала мне нужно найти первую ячейку, содержащую значение «Всего». Ячейка, к которой я пытаюсь добраться, является третьей ячейкой ПОСЛЕ «Всего» ячейка для хранения значения "Tech". Точно известно, что ячейки (1, 1) не содержат «Tech». или "Всего".

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, и никакие ресурсы, которые я нашел до сих пор, не ответили на этот вопрос. Пожалуйста помоги!

Range.FindNext кажется в конечном счете сломанным. Он никогда не работал для меня, даже используя тот же код, что и в примере Microsoft. Nick Bedford

Ваш Ответ

2   ответа
1

Topic: .Find и .FindNext в 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
1

Итого & quot; не найден, то FirstTotal будет Nothing, что приведет к несоответствию типов при попытке использовать FirstTotal для & quot; После & quot; аргумент в ResultRange Find (2-я строка). Это предотвратит эту ошибку:

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

Вообще говоря, любые зависимые находки должны рассматриваться таким образом.

Ясно, что здесь требуется какое-то другое заявление, но я не знаю, что это будет.

Мы знаем, что это означает "Всего" не найдено. Это означает, что SearchRange не содержит & quot; Всего. & Quot; Я бы посмотрел, какой адрес у SearchRange, когда "Total" не найдено.
Согласно некоторым уведомлениям об отладке, которые я добавлял, FirstTotal устанавливается правильно в 50% случаев, а остальное время пусто. До этого в коде нет других вызовов .ind или .FindNext. Можете ли вы назвать причину, по которой это может произойти? Evan Patrick McCann

Похожие вопросы