Excel VBA - salir para bucle


181

Me gustaría salir de mi forbucle cuando se cumpla una condición interna. ¿Cómo podría salir de mi forbucle cuando ifse cumple la condición? Creo que hay algún tipo de salida al final de mi ifdeclaración, pero no sé cómo funcionaría.

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 Fordentro de tu circuito
Dan

Respuestas:


333

Para salir de su ciclo temprano puede usar Exit For

If [condition] Then Exit For


1
@nixda Elimine su comentario, ya que el hipervínculo que compartió apunta a la documentación de VB.NET, no a la documentación de Office VBA. La Exitdeclaración de VBA tiene menos opciones que las de VB.NET. De hecho, VBA solo admite: Exit Do Exit For Exit Function Exit Propertyy Exit Sub. VBA no tiene Exit While. El enlace correcto es: Referencia de Office VBA -Salida
Excel Hero

@ExcelHero Hecho
nixda

27

Otra forma de salir temprano de un bucle For es cambiar el contador del bucle:

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
Asignar un contador de bucle es mucho menos robusto y a prueba de futuro que salir explícitamente del bucle. El primero puede romperse por un cambio en el máximo del contador de bucle ya que el código se modifica si el editor no nota que también se está utilizando en otro lugar. Tampoco se aplica a los For Eachbucles.
jpmc26

2
Esta es simplemente otra solución a la pregunta específica del Forbucle (no For Each). Los pros y los contras se aplican a diferentes soluciones y diferentes situaciones; por ejemplo, este es un formato más robusto que el Go To labelque frena la lógica (programación no estructurada) o una posible solución alternativa de la Continuepalabra clave, que falta en VBA. Los méritos de Exit Forse pueden cuestionar también si la lógica no realiza una limpieza adecuada de los objetos; sin embargo, las malas implementaciones no son muy relevantes aquí (@ jpmc26)
Paul Bica

0

La primera respuesta dada con lo siguiente es, de hecho, la mejor práctica de la OMI:

if i = 0 then exit for

Sin embargo, esta también es una opción:

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.