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

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


@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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.