🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

VBA Exit For dans Excel — Exit For, Exit Do, Exit Sub et la sortie anticipée propre

|

VBA Exit For dans Excel — Exit For, Exit Do, Exit Sub et la sortie anticipée propre

TL;DR — Exit For quitte immédiatement une boucle For ; Exit Do quitte une boucle Do ; Exit Sub et Exit Function renvoient depuis une procédure. C'est une seule idée — quitter tout de suite la structure courante — et le code après cette structure continue de s'exécuter. Le piège : Exit For ne quitte que la boucle la plus interne, si bien que dans des boucles imbriquées celle de l'extérieur poursuit. VBA n'a ni Continue ni Exit If ; pour sauter une seule itération, vous utilisez un If (ou, rarement, un GoTo vers un label juste avant Next).

Sub FindFirstMatch()
    Dim i As Long, found As Long
    For i = 1 To 100000
        If Cells(i, 1).Value = "TARGET" Then
            found = i
            Exit For              ' arreter des qu'on le trouve - inutile de scanner le reste
        End If
    Next i
    MsgBox IIf(found > 0, "Found on row " & found, "Not found")
End Sub

Exit est la façon de quitter un bloc tôt sans quitter tout le programme. Sortez d'une boucle avec Exit For ou Exit Do, revenez d'une procédure avec Exit Sub, et laissez le reste de la macro poursuivre. Ce dernier point est tout l'intérêt, et la ligne qui sépare Exit de End : Exit ferme une porte ; End débranche la prise.

Ce que vous allez apprendre

  • Le modèle mental qui relie Exit For, Exit Do, Exit Sub et Exit Function en une seule règle
  • Pourquoi Exit For sort d'une boucle, et pourquoi le code après la boucle s'exécute quand même
  • Le piège numéro un : Exit For ne quitte que la boucle la plus interne dans un For imbriqué
  • Pourquoi VBA n'a ni Continue ni Exit If, et comment sauter proprement une seule itération
  • Le motif de la clause de garde (If ... Then Exit Sub) qui remplace des blocs If profondément imbriqués
  • En quoi Exit Sub diffère de End — quitter une procédure plutôt qu'arrêter toute la macro

Le modèle mental : quitter cette structure, garder le programme en marche

Chaque forme d'Exit nomme la structure qu'elle quitte, et ne quitte que cette structure :

Exit For        ' quitte la boucle For englobante
Exit Do         ' quitte la boucle Do englobante
Exit Sub        ' quitte le Sub englobant (retour a l'appelant)
Exit Function   ' quitte la Function englobante (retour a l'appelant)

Voyez votre procédure comme une série de pièces imbriquées — un Sub contient une boucle, la boucle contient un If. Exit For sort de la pièce de la boucle mais reste dans le Sub. Exit Sub sort de la procédure entière. Dans tous les cas, l'exécution reprend à la première chose située hors de la structure que vous avez quittée — la ligne après Next, ou l'appelant qui a invoqué votre Sub. Rien de ce qui suit votre Exit à l'intérieur de ce bloc ne s'exécute, mais tout ce qui suit le bloc, oui. C'est ce qui rend Exit structuré : vous savez toujours exactement où atterrit le contrôle, parce qu'il atterrit juste à l'extérieur de la boîte que vous avez nommée.

Exit For : arrêter une boucle dès que vous avez fini

Par défaut, une boucle For exécute chaque itération. Très souvent, vous n'avez pas besoin de chaque itération — vous cherchez, et une fois la réponse trouvée, les passages restants sont du travail perdu :

Dim i As Long
For i = 2 To 100000
    If Cells(i, 1).Value = "" Then Exit For   ' premiere ligne vide - on s'arrete ici
Next i
' i contient la ligne ou on s'est arrete ; l'execution continue depuis cette ligne

Deux points méritent d'être fixés. D'abord, Exit For ne réinitialise ni ne vide le compteur de boucle — après la boucle, i conserve la valeur qu'il avait au moment de la sortie, ce qui est souvent exactement ce que vous voulez (la ligne où vous vous êtes arrêté). Ensuite, la boucle est la seule chose que vous avez quittée. Tout code après Next i s'exécute normalement. Si vous vouliez abandonner la procédure entière, c'est Exit Sub, pas Exit For.

Le piège numéro un : Exit For ne quitte que la boucle la plus interne

C'est l'erreur qui coûte un après-midi entier. Quand vous imbriquez un For dans un autre, Exit For ne quitte que la boucle où il se trouve — l'interne. La boucle externe poursuit comme si de rien n'était :

Dim r As Long, c As Long
For r = 1 To 100
    For c = 1 To 50
        If Cells(r, c).Value = "STOP" Then Exit For   ' quitte la boucle c UNIQUEMENT
    Next c
    ' <-- le controle atterrit ICI, et la boucle externe r continue jusqu'a r = 100
Next r

Il n'existe pas d'Exit For, For pour franchir deux niveaux d'un coup. Quand vous devez vraiment arrêter les deux boucles, vous avez trois options honnêtes : poser un drapeau Boolean et le tester dans la condition de la boucle externe ; déplacer les boucles imbriquées dans leur propre Function et utiliser Exit Function pour quitter les deux à la fois ; ou, le seul endroit où les vétérans du VBA y recourent encore, un GoTo vers un label juste après le Next externe. L'approche Function est généralement la plus propre — voyez VBA GoTo pour comprendre pourquoi le saut est un dernier recours.

Exit Do : la même idée pour les boucles Do

Les boucles Do ont leur propre mot-clé, Exit Do, pour exactement la même raison. Il compte surtout pour le Do ... Loop sans condition, qui sinon tournerait indéfiniment :

Dim n As Long
Do
    n = n + 1
    If n > 1000 Then Exit Do          ' la seule sortie de cette boucle
Loop

Utilisez Exit Do dans Do While, Do Until et le Do ... Loop nu. N'essayez pas d'employer Exit For dans une boucle Do, ni l'inverse — le mot-clé doit correspondre au type de boucle, sinon VBA lève une erreur de compilation. Pour la différence entre les formes de boucle elles-mêmes, voyez VBA While Loop.

Exit Sub et Exit Function : revenir tôt d'une procédure

Hors des boucles, la même idée vous fait revenir d'une procédure entière. Exit Sub met fin à un Sub immédiatement et rend le contrôle à ce qui l'a appelé ; Exit Function fait de même pour une Function, en renvoyant la valeur que le nom de la fonction contient à ce moment-là :

Function SafeDivide(a As Double, b As Double) As Double
    If b = 0 Then
        SafeDivide = 0
        Exit Function        ' renvoyer 0 maintenant ; sauter la division ci-dessous
    End If
    SafeDivide = a / b
End Function

Notez l'ordre dans Exit Function : fixez la valeur de retour avant de sortir, car Exit Function part aussitôt et n'atteint jamais les lignes en dessous. Cette forme — « vérifier une condition, se retirer tôt » — est la chose la plus utile que fasse Exit, et elle porte un nom.

Le motif de la clause de garde : Exit Sub au lieu de If imbriqués

Quand une procédure a des préconditions — une feuille doit exister, une cellule ne doit pas être vide, l'utilisateur doit avoir choisi quelque chose — la structure tentante est une pyramide de blocs If imbriqués. L'alternative plus plate et plus lisible est une clause de garde : testez chaque précondition en tête et faites Exit Sub si elle échoue, pour que le vrai travail s'exécute contre la marge gauche, sans imbrication :

Sub ProcessSelection()
    If Selection Is Nothing Then Exit Sub
    If Selection.Cells.Count = 0 Then Exit Sub
    If Not TypeName(Selection) = "Range" Then Exit Sub

    ' ici, chaque precondition est satisfaite - au travail, sans imbrication
    Dim cell As Range
    For Each cell In Selection
        cell.Value = UCase(cell.Value)
    Next cell
End Sub

Chaque garde se lit comme une phrase simple — « s'il n'y a rien de sélectionné, nous avons terminé ». Le gain, c'est que le code important n'est jamais enseveli sous trois niveaux de If. Quand une procédure a une raison claire de s'arrêter tôt, une garde Exit Sub en tête vaut mieux que d'envelopper tout le corps dans If ... End If.

Il n'y a ni Continue ni Exit If en VBA

Deux choses que les programmeurs venus d'autres langages cherchent et ne trouveront pas. VBA n'a aucune instruction Continue pour passer à l'itération suivante, et aucun Exit If — Exit ne quitte que les boucles et les procédures, jamais un bloc If (un If se termine tout seul à son End If). Pour sauter une itération d'une boucle, enveloppez le corps dans un If de sorte que le saut revienne à « ne rien faire cette fois » :

For i = 1 To n
    If Cells(i, 1).Value = "" Then
        ' sauter les lignes vides - ne rien faire et poursuivre vers Next
    Else
        ' traiter ici les lignes non vides
    End If
Next i

Ce If inversé est le « continue » idiomatique du VBA. L'alternative que vous verrez dans du code plus ancien — un GoTo vers un label placé juste avant Next — fonctionne, mais c'est un saut, et les sauts sont plus difficiles à suivre qu'un If. N'y recourez que lorsque la logique de saut est vraiment trop emmêlée pour un If, et voyez d'abord VBA GoTo.

Exit n'est pas End : une porte, pas la prise

La frontière la plus importante de cette page. Exit Sub revient de la procédure courante et laisse le programme continuer — l'appelant exécute sa ligne suivante, votre nettoyage s'exécute, Excel reste dans un état sain. End arrête net toute la macro : il jette chaque variable, ferme les UserForms et — le vrai dégât — saute tout nettoyage que vous aviez prévu, si bien que Application.ScreenUpdating peut rester False et les événements rester désactivés. Quand vous voulez quitter cette procédure, la réponse est presque toujours Exit Sub, jamais End.

Comment ExcelMaster vous aide

La sortie anticipée est le point de rencontre entre « correct » et « rapide » : une recherche qui s'arrête à la première correspondance au lieu de parcourir 100 000 lignes, une procédure qui se retire proprement quand ses entrées sont mauvaises. Les deux erreurs classiques sont d'attendre d'Exit For qu'il sorte de boucles imbriquées, et de confondre Exit Sub (quitter la procédure) avec End (tout arrêter et sauter le nettoyage).

ExcelMaster vous laisse décrire l'objectif — « trouver la première ligne où la colonne A est vide et s'arrêter » — et il écrit la boucle avec le bon Exit, ajoute des clauses de garde pour les préconditions, et structure le nettoyage pour que rien ne reste à moitié fait. Vous gardez le classeur et le code.

Questions fréquentes

Comment sortir d'une boucle For en VBA ?

Utilisez Exit For. Il quitte immédiatement la boucle For englobante et continue à la première ligne après Next. On le place généralement dans un If pour que la boucle ne s'arrête que lorsqu'une condition est remplie, par exemple If Cells(i, 1).Value = "TARGET" Then Exit For. Le compteur de boucle conserve sa valeur courante après la sortie, souvent la ligne ou l'indice que vous cherchiez.

Exit For sort-il des boucles imbriquées ?

Non — Exit For ne quitte que la boucle la plus interne où il se trouve ; la boucle externe continue. VBA n'a aucun moyen de sortir de deux niveaux de boucle avec une seule instruction. Pour arrêter les deux, posez un drapeau Boolean et testez-le dans la boucle externe, déplacez les boucles imbriquées dans une Function et utilisez Exit Function, ou faites un GoTo vers un label placé après le Next externe.

Quelle est la différence entre Exit Sub et End ?

Exit Sub revient de la procédure courante et laisse le programme continuer — l'appelant reprend, et tout nettoyage que vous avez s'exécute. End arrête toute la macro d'un coup : il efface toutes les variables, ferme les formulaires et saute votre nettoyage, ce qui peut laisser ScreenUpdating désactivé ou les événements désactivés. Pour quitter une procédure, utilisez Exit Sub ; réservez End aux véritables urgences.

Comment sauter une itération dans une boucle VBA ?

VBA n'a pas d'instruction Continue. La manière idiomatique est d'envelopper le corps de la boucle dans un If pour que les itérations à sauter ne fassent rien et poursuivent simplement vers Next. Le code plus ancien utilise parfois un GoTo vers un label juste avant Next pour émuler Continue, mais un If inversé est plus clair et n'introduit pas de saut.

Existe-t-il un Exit Do et un Exit While ?

Il existe Exit Do, qui quitte n'importe quelle boucle Do (Do While, Do Until ou un Do ... Loop nu). Il n'existe pas d'Exit While — la vieille boucle While ... Wend n'a aucune instruction de sortie, une raison de plus de préférer les boucles Do. Le mot-clé Exit doit correspondre au type de boucle : utilisez Exit For dans les boucles For et Exit Do dans les boucles Do.

Testé dans

Testé dans : Excel 365 (Windows 11), VBA 7.1 — vérifié le 24/09/2026.

Guides associés : VBA GoTo · VBA End · VBA For Loop · VBA While Loop · VBA On Error