Range.Find и с зависает Excel - PullRequest
       7

Range.Find и с зависает Excel

0 голосов
/ 04 августа 2020

Запись Microsoft в функции Range.Find VBA имеет следующий код в качестве примера (https://docs.microsoft.com/en-us/office/vba/api/excel.range.find):

   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) 
        Loop While Not c Is Nothing
    End If 
End With

Я пытался использовать его, включая следующий оператор With , но Excel завис.

   With Range("a1:f50")
     Set c = .Find("F-Value", LookIn:=xlValues)
     If Not c Is Nothing Then
        firstAddress = c.Address
        Do
            With c.Borders(xlEdgeLeft)
                     .LineStyle = xlContinuous
                     .ColorIndex = 0
                     .TintAndShade = 0
                     .Weight = xlThin
            End With
            Set c = .FindNext(c)
         Loop While Not c Is Nothing
     End If
 End With

Интересно, если использование Range.Find и With делает код слишком тяжелым, потому что я купил компьютер в этом году, и он в целом работает нормально.

1 Ответ

2 голосов
/ 04 августа 2020

Вы удалили проверку c.Address <> firstAddress, которая является единственным способом выйти из l oop в вашем варианте использования.

Find()/FindNext() всегда циклически повторяется в пределах вашего диапазона, пока нет подходящего значения - когда он доходит до конца, он просто снова начинается с начала. Как вы это учитываете, зависит от того, что вы делаете со значением ячейки после того, как ячейка была обнаружена

  • Если вы заменяете значение таким образом, что оно больше не будет соответствовать Найти, вы можете выйти из l oop, как только Find() не сможет найти совпадение и поэтому вернет Nothing (см. Второй пример кода ниже)

  • Если вы не изменение значения ячейки в l oop, тогда Find будет просто продолжать цикл, возвращая одни и те же ячейки снова и снова, если у вас нет способа выйти из l oop после того, как все отдельные ячейки были найдены. Обычно вы делаете это, сохраняя адрес первой ячейки, а затем выходя из l oop, как только эта ячейка возвращается во второй раз.

Так что для вашего "no- заменить вариант использования, это отлично работает:

    Dim firstAddress As String, c As Range

    With Range("a1:f50")
         Set c = .Find("F-Value", LookIn:=xlValues, LookAt:=xlWhole) '<<be specific
         If Not c Is Nothing Then
            firstAddress = c.Address '<< remember the first cell found
            Do
                With c.Borders(xlEdgeLeft)
                         .LineStyle = xlContinuous
                         .ColorIndex = 0
                         .TintAndShade = 0
                         .Weight = xlThin
                End With
                Set c = .FindNext(c)
             Loop While c.Address <> firstAddress '<< exit once we've hit the first cell again
         End If
     End With

Для сравнения вот версия «найти с заменой»:

    Dim  c As Range

    With Range("a1:f50")
         Set c = .Find("F-Value", LookIn:=xlValues, LookAt:=xlWhole)
         Do While Not c Is Nothing
             c.Value = "SomeOtherValue"
             Set c = .FindNext(c)
         Loop 
    End With
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...