Wpis Microsoft w zasięgu "Nofollow NefErr"> 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

Próbowałem go użyć, w tym następujące z oświadczeniem, ale Excel zamarł.

   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

Zastanawiam się, czy korzystanie z obu zasięgu

0
Incognito 4 sierpień 2020, 01:02

1 odpowiedź

Najlepsza odpowiedź

Usunięto sprawdzić c.Address <> firstAddress, który jest jedynym sposobem wyjścia z pętli w obudowie użycia.

Find()/FindNext() zawsze pętle w obrębie w swoim zasięgu, aż nie ma pasującej wartości - gdy dojdzie do końca, po prostu zaczyna się ponownie na początku. Jak się uwzględniasz, zależy od tego, co robisz z wartością komórek po zlokalizowaniu komórki

  • Jeśli zastąpisz wartość tak, że nie będzie już dopasowywanie do znaleziska, możesz wyjść z pętli tak szybko, jak Find() nie spowoduje meczu i tak zwróć Nothing (patrz drugi kod przykład poniżej)

  • Jeśli jesteś nie Zmiana wartości komórek w pętli, znajdź po prostu zapętlanie się wokół, zwracając te same komórki w kółko, chyba że masz jakiś sposób, aby wyjść z pętli, gdy wszystkie poszczególne komórki mają został znaleziony. Zazwyczaj robisz to, zapisując adres pierwszej komórki, a następnie wychodzi z pętli, gdy tylko ta komórka zostanie zwrócona po raz drugi.

Tak więc dla twojego "bez zastąpienia" przypadków działa dobrze:

    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

Dla porównania tutaj wersja "Znajdź z zastąpieniem":

    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
2
Tim Williams 4 sierpień 2020, 15:36