Excel VBA - sortie pour la boucle


184

Je voudrais quitter ma forboucle lorsqu'une condition à l'intérieur est remplie. Comment sortir de ma forboucle lorsque la ifcondition est remplie? Je pense à une sorte de sortie à la fin de ma ifdéclaration, mais je ne sais pas comment cela fonctionnerait.

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 Fordans votre boucle
Dan

Réponses:


338

Pour quitter votre boucle tôt, vous pouvez utiliser Exit For

If [condition] Then Exit For


1
@nixda Veuillez supprimer votre commentaire, car le lien hypertexte que vous avez partagé pointe vers la documentation VB.NET et non vers la documentation Office VBA. La Exitdéclaration de VBA a moins d'options que celle de VB.NET. En fait, VBA ne prend en charge que: Exit Do Exit For Exit Function Exit Propertyet Exit Sub. VBA n'a pas Exit While. Le lien correct est: Référence Office VBA - Instruction de sortie
Excel Hero

@ExcelHero Done
nixda

27

Une autre façon de quitter tôt une boucle For est de changer le compteur de boucle:

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
Assigner un compteur de boucle est beaucoup moins robuste et à l'épreuve du temps que de quitter explicitement la boucle. Le premier peut être rompu par une modification du maximum du compteur de boucles car le code est modifié si l'éditeur ne remarque pas qu'il est également utilisé ailleurs. Cela ne s'applique pas non plus aux For Eachboucles.
jpmc26

2
C'est simplement une autre solution à la question spécifique à la Forboucle (non For Each). Les avantages et les inconvénients s'appliquent à différentes solutions et à différentes situations - par exemple, il s'agit d'un format plus robuste que celui Go To labelqui freine la logique (programmation non structurée), ou une solution de contournement possible du Continuemot - clé, manquant dans VBA. Les mérites de Exit Forpeuvent également être remis en question si la logique n'effectue pas un nettoyage correct des objets - les mauvaises implémentations ne sont pas tout à fait pertinentes ici cependant (@ jpmc26)
paul bica

0

La première réponse donnée avec ce qui suit est en effet la meilleure pratique de l'OMI:

if i = 0 then exit for

Cependant, c'est aussi une 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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.