Excel VBA - esci per loop


181

Vorrei uscire dal mio forciclo quando viene soddisfatta una condizione interna. Come potrei uscire dal mio forciclo quando la ifcondizione è stata soddisfatta? Penso che una specie di uscita alla fine della mia ifaffermazione, ma non so come funzionerebbe.

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 Fornel tuo giro
Dan,

Risposte:


333

Per uscire anticipatamente dal loop puoi usare Exit For

If [condition] Then Exit For


1
@nixda Rimuovi il tuo commento, poiché il collegamento ipertestuale che hai condiviso punta alla documentazione VB.NET, non alla documentazione VBA di Office. L' Exitaffermazione di VBA ha meno opzioni rispetto a VB.NET. In effetti, VBA supporta solo: Exit Do Exit For Exit Function Exit Propertye Exit Sub. VBA ha no Exit While. Il collegamento corretto è: Riferimento VBA di Office
Excel Hero

@ExcelHero Done
nixda,

27

Un altro modo per uscire anticipatamente da un ciclo For è cambiare il contatore di loop:

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
Assegnare un contatore di loop è molto meno robusto e a prova di futuro rispetto all'uscita esplicita dal loop. Il primo può essere interrotto da una modifica del massimo del contatore loop poiché il codice viene modificato se l'editor non nota che viene utilizzato anche altrove. Inoltre non si applica ai For Eachloop.
jpmc26,

2
Questa è semplicemente un'altra soluzione alla domanda specifica del Forloop (non For Each). Pro e contro si applicano a soluzioni e situazioni diverse, ad esempio questo è un formato più robusto di quello Go To labelche frena la logica (programmazione non strutturata) o una possibile soluzione alternativa della Continueparola chiave, mancante in VBA. I meriti di Exit Forpossono anche essere messi in discussione se la logica non esegue una corretta pulizia degli oggetti - le cattive implementazioni non sono abbastanza rilevanti qui (@ jpmc26)
paul bica,

0

La prima risposta data con le seguenti è davvero la migliore pratica imo:

if i = 0 then exit for

Tuttavia, questa è anche un'opzione:

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.