Excel VBA - Exit für Schleife

181

Ich möchte meine forSchleife verlassen, wenn eine Bedingung im Inneren erfüllt ist. Wie kann ich meine forSchleife verlassen, wenn die ifBedingung erfüllt ist? Ich denke, eine Art Exit am Ende meiner ifAussage, aber ich weiß nicht, wie das funktionieren würde.

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
quelle
13
If [condition] Then Exit Forin Ihrer Schleife
Dan

Antworten:

333

Um Ihre Schleife vorzeitig zu verlassen, können Sie verwenden Exit For

If [condition] Then Exit For

Dan
quelle
@nixda Bitte entfernen Sie Ihren Kommentar, da der von Ihnen freigegebene Hyperlink auf die VB.NET-Dokumentation und nicht auf die Office VBA-Dokumentation verweist. Die ExitAnweisung von VBA enthält weniger Optionen als die von VB.NET. Tatsächlich unterstützt VBA nur: Exit Do Exit For Exit Function Exit Propertyund Exit Sub. VBA hat keine Exit While. Der richtige Link lautet: Office VBA-Referenz - Beendigungsanweisung
Excel Hero
@ExcelHero Fertig
nixda
27

Eine andere Möglichkeit, eine For-Schleife vorzeitig zu beenden, besteht darin, den Schleifenzähler zu ändern:

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
quelle
3
Das Zuweisen eines Schleifenzählers ist viel weniger robust und zukunftssicher als das explizite Verlassen der Schleife. Ersteres kann durch eine Änderung des Maximums des Schleifenzählers unterbrochen werden, wenn der Code geändert wird, wenn der Editor nicht bemerkt, dass er auch an anderer Stelle verwendet wird. Dies gilt auch nicht für For EachSchleifen.
jpmc26
2
Dies ist einfach eine andere Lösung für die Frage, die für die ForSchleife spezifisch ist (nicht For Each). Vor- und Nachteile gelten für unterschiedliche Lösungen und Situationen - zum Beispiel ist dies ein robusteres Format als das, Go To labeldas die Logik bremst (nicht strukturierte Programmierung) oder eine mögliche Problemumgehung des Continuein VBA fehlenden Schlüsselworts. Die Vorzüge von Exit Forkönnen auch in Frage gestellt werden, wenn die Logik keine ordnungsgemäße Bereinigung von Objekten durchführt - schlechte Implementierungen sind hier jedoch nicht ganz relevant (@ jpmc26)
paul bica
0

Die erste Antwort, die mit folgendem gegeben wird, ist in der Tat imo Best Practice:

if i = 0 then exit for

Dies ist jedoch auch eine Option:

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
quelle