Вы удалили проверку 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