Excel VBA - wyjście dla pętli

181

Chciałbym opuścić forpętlę, gdy spełniony zostanie warunek w środku. Jak mogę wyjść z forpętli, gdy ifwarunek zostanie spełniony? Myślę, że jakieś wyjście na końcu mojego ifoświadczenia, ale nie wiem, jak by to działało.

Dim i As Long
For i = 1 To 50
    Range("B" & i).Select
    If Range("B" & i).Value = "Artikel" Then
        Dim temp As Long
        temp = i
    End If
Next i
Range("A1:Z" & temp - 1).EntireRow.Delete Shift:=xlToLeft
CustomX
źródło
13
If [condition] Then Exit Forw twojej pętli
Dan

Odpowiedzi:

333

Aby wcześniej wyjść z pętli, możesz użyć Exit For

If [condition] Then Exit For

Dan
źródło
@nixda Usuń komentarz, ponieważ udostępnione hiperłącze wskazuje dokumentację VB.NET, a nie dokumentację Office VBA. ExitInstrukcja VBA ma mniej opcji niż VB.NET. W rzeczywistości VBA obsługuje tylko: Exit Do Exit For Exit Function Exit Propertyi Exit Sub. VBA nie ma Exit While. Prawidłowy link to: Dokumentacja Office VBA
Excel Hero
@ExcelHero Gotowe
nixda
27

Innym sposobem wcześniejszego wyjścia z pętli For jest zmiana licznika pętli:

For i = 1 To 10
    If i = 5 Then i = 10
Next i

Debug.Print i   '11

For i = 1 To 10
    If i = 5 Then Exit For
Next i

Debug.Print i   '5
Paul Bica
źródło
3
Przypisanie licznika pętli jest znacznie mniej niezawodne i zabezpieczone na przyszłość niż bezpośrednie opuszczanie pętli. To pierwsze może zostać zerwane przez zmianę maksimum licznika pętli, ponieważ kod jest modyfikowany, jeśli edytor nie zauważy, że jest on również używany gdzie indziej. Nie dotyczy to również For Eachpętli.
jpmc26
2
Jest to po prostu inne rozwiązanie pytania specyficznego dla Forpętli (nie For Each). Za i przeciw stosuje się różne rozwiązania i różne sytuacje - na przykład jest to bardziej niezawodny format niż ten, Go To labelktóry hamuje logikę (programowanie niestrukturalne) lub możliwe obejście Continuesłowa kluczowego, którego brakuje w VBA. Zalety Exit Formożna również zakwestionować, jeśli logika nie wykonuje poprawnego czyszczenia obiektów - złe implementacje nie są tu jednak całkiem istotne (@ jpmc26)
paul bica
0

Pierwsza odpowiedź udzielona w następujący sposób jest rzeczywiście najlepszą praktyką:

if i = 0 then exit for

Jest to jednak również opcja:

Sub some()

Count = 0
End_ = ThisWorkbook.Sheets(1).Range("B1047854").End(xlUp).Row

While Count < End_ And Not ThisWorkbook.Sheets(1).Range("B" & Count).Value = "Artikel"
    Count = Count + 1
    If ThisWorkbook.Sheets(1).Range("B" & Count).Value = "Artikel" Then
        ThisWorkbook.Sheets(1).Range("A1:Z" & Count - 1).EntireRow.Delete Shift:=xlToLeft
    End If
Wend

End Sub
ko_00
źródło