Excel VBA - saída para loop

181

Gostaria de sair do meu forloop quando uma condição interna for atendida. Como eu poderia sair do meu forloop quando a ifcondição foi atendida? Eu acho que algum tipo de saída no final da minha ifdeclaração, mas não sei como isso funcionaria.

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
fonte
13
If [condition] Then Exit Fordentro de seu loop
Dan

Respostas:

333

Para sair do seu loop mais cedo, você pode usar Exit For

If [condition] Then Exit For

Dan
fonte
1
@nixda Remova o seu comentário, pois o hiperlink que você compartilhou aponta para a documentação do VB.NET, não para a documentação do Office VBA. A Exitdeclaração do VBA tem menos opções do que o VB.NET. De fato, o VBA suporta apenas: Exit Do Exit For Exit Function Exit Propertye Exit Sub. VBA não tem Exit While. O link correto é: Referência do Office VBA
Excel Hero
@ExcelHero Concluído
nixda 27/03
27

Outra maneira de sair cedo de um loop For é alterando o contador de 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
paul bica
fonte
3
Atribuir um contador de loop é muito menos robusto e à prova do futuro do que sair explicitamente do loop. O primeiro pode ser quebrado por uma alteração no máximo do contador de loop, pois o código é modificado se o editor não perceber que também está sendo usado em outro lugar. Também não se aplica a For Eachloops.
Jpmc26 23/0218
2
Esta é simplesmente outra solução para a questão específica do Forloop (não For Each). Prós e contras se aplicam a diferentes soluções e situações diferentes - por exemplo, este é um formato mais robusto do que o Go To labelque freia a lógica (programação não estruturada) ou uma possível solução alternativa da Continuepalavra - chave ausente no VBA. Os méritos de Exit Forpode ser questionada, bem como se a lógica não executar a limpeza adequada de objetos - implementações ruins não são muito relevantes aqui embora (@ jpmc26)
paul bica
0

A primeira resposta dada com a seguinte é de fato a melhor prática:

if i = 0 then exit for

No entanto, isso também é uma opção:

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
fonte