Excel VBA зацикливается бесконечно - PullRequest
0 голосов
/ 23 апреля 2019

Я совсем новичок в VBA

Я получаю бесконечный цикл с кодом ниже, когда я ожидаю, что поиск остановится при достижении последнего вхождения. (У меня есть 2 ячейки в текущем рабочем пространстве, которые содержат >>>). Может кто-нибудь сказать мне, что происходит не так?

Set titles = Range("A1:A1")
Dim bEndLoop As Boolean
bEndLoop = False
' lookup part of content in search
mCurLookup = xlPart
With possibleTitles
    Do While Not bEndLoop
        Set titles = .Find(What:=">>>", After:=ActiveCell)
        If Not titles Is Nothing Then
               Application.Goto titles, True
                MsgBox (titles.Address)
                titles.Activate
            Else
                MsgBox "Nothing found"
                bEndLoop = True
            End If
    ' Set t2 = titles(1).CurrentRegion
    Loop
End With

Ответы [ 2 ]

2 голосов
/ 23 апреля 2019

Ниже приведен пример вашего кода с использованием метода Find FindNext.Использование этого метода намного быстрее, чем использование For Loop эквивалента

Dim titles As Range
Dim possibleTitles As Range
Dim firstAddress As String

Set possibleTitles = ActiveSheet.Range("A:A")

With possibleTitles
    Set titles = .Find(what:=">>>")
    If Not titles Is Nothing Then
        firstAddress = titles.Address

        Do
            MsgBox titles.Address
            Set titles = .FindNext(titles)
        Loop Until firstAddress = titles.Address
    End If
End With
2 голосов
/ 23 апреля 2019

думаю, что ответ должен выглядеть следующим образом (из https://docs.microsoft.com/en-us/office/vba/api/excel.range.findnext). Мне не нравится поиск из 2 частей, затем FindNext (не могу ли я иметь только один цикл?), Но тогда, если это официальный путьЯ думаю, что лучше придерживаться этого.

With Worksheets(1).Range("a1:a500")
     Set c = .Find(2, lookin:=xlValues)
     If Not c Is Nothing Then
        firstAddress = c.Address
        Do
            c.Value = 5
            Set c = .FindNext(c)
            If c is Nothing Then Exit Do
        Loop While c.Address <> firstAddress
      End If
End With
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...