Boucles
Glissez pour afficher le menu
Chaque technique vue jusqu'à présent traitait une valeur à la fois. Les boucles permettent d'appliquer la même logique à de nombreuses valeurs consécutives — cinq produits, cinq cents commandes, ou autant de lignes qu'une table peut contenir — sans avoir à copier-coller le même bloc de code à répétition.
For...Next
Répète un bloc de code un nombre fixe et connu de fois :
Dim i As Long
For i = 1 To 5
Debug.Print "Row " & i
Next i
' Step lets you skip or count backward
For i = 10 To 1 Step -1
Debug.Print i
Next i
Dans la première boucle, i commence à 1, le code à l'intérieur s'exécute une fois avec cette valeur, puis i augmente automatiquement de 1 et tout le bloc s'exécute à nouveau — cela se répète jusqu'à ce que i dépasse 5, moment où la boucle s'arrête simplement et l'exécution continue après Next. Step modifie l'incrément : Step -1 compte à rebours au lieu de l'incrément par défaut de +1, et Step 2 compterait de deux en deux. La variable de boucle i n'est pas une syntaxe spéciale — c'est simplement une variable Long ordinaire que VBA met à jour à chaque passage.
For Each
Parcourt directement chaque élément d'une collection, sans avoir besoin de connaître leur nombre ou de gérer un compteur :
Dim cell As Range
For Each cell In ThisWorkbook.Worksheets("Products").Range("B2:B6")
Debug.Print cell.Value
Next cell
Ici, cell prend successivement chaque cellule individuelle de la plage B2:B6, et on lit son contenu avec .Value. À comparer avec For...Next : avec For...Next, on parcourt des nombres et on utilise ce nombre pour accéder à une valeur ; avec For Each, on parcourt directement les éléments eux-mêmes, ce qui est plus naturel lorsqu'on travaille avec des plages de feuilles de calcul.
Do While
Répète tant qu'une condition reste True — la boucle ne sait pas à l'avance combien de fois elle s'exécutera, ce qui la distingue de For...Next :
Dim stock As Integer
stock = 134
Do While stock > 0
stock = stock - 30 ' simulate selling in batches of 30
Loop
Debug.Print stock ' whatever's left after the loop stops
VBA vérifie stock > 0 avant chaque passage dans la boucle, y compris le tout premier. Suivez-le à la main : 134 → 104 → 74 → 44 → 14, puis la condition est vérifiée à nouveau — 14 est encore supérieur à 0, donc la boucle s'exécute encore une fois, arrivant à -16. Ce n'est qu'alors que stock > 0 devient finalement False, et la boucle s'arrête avec stock à -16, pas exactement à 0 ou 14. Il est important de bien suivre ce mécanisme la première fois, car c'est une source fréquente d'erreurs de dépassement : une boucle Do While continue tant que la condition est vraie au moment du test, même si l'action à l'intérieur dépasse la limite prévue.
Do Until
Il existe aussi Do Until, qui est l'image miroir de Do While — elle répète tant qu'une condition est False et s'arrête dès que cette condition devient True, au lieu de l'inverse. Le choix dépend de la façon dont on exprimerait la règle métier à l'oral : « continuer tant qu'il reste du stock » suggère Do While ; « continuer jusqu'à épuisement du stock » suggère Do Until — les deux peuvent produire un comportement identique, simplement formulé différemment.
Instructions Exit
Permettent de sortir d'une boucle prématurément, avant que la condition de fin naturelle ne soit atteinte :
For i = 1 To 100
If i = 10 Then Exit For ' stop the loop immediately
Debug.Print i
Next i
Cette boucle est prévue pour compter jusqu'à 100, mais dès que i atteint 10, Exit For l'arrête net — rien après Exit For ne s'exécute, et l'exécution passe directement à la ligne après Next i. C'est le schéma à utiliser pour parcourir une liste et s'arrêter dès qu'on a trouvé ce que l'on cherche, sans continuer inutilement à vérifier les éléments restants.
Mise en pratique
Toutes les techniques de ce chapitre — variables, opérateurs, fonctions, logique conditionnelle, et maintenant boucles — se combinent dans la procédure vers laquelle ce chapitre a convergé :
Option Explicit
Sub CheckStockLevels()
' Sample data standing in for the Products table
Dim products(1 To 5) As String
Dim stockLevels(1 To 5) As Integer
Dim reorderLevels(1 To 5) As Integer
Dim i As Long
Dim alertMessage As String
products(1) = "Laptop Stand": stockLevels(1) = 58: reorderLevels(1) = 20
products(2) = "Wireless Mouse": stockLevels(2) = 134: reorderLevels(2) = 30
products(3) = "USB-C Hub": stockLevels(3) = 44: reorderLevels(3) = 15
products(4) = "Monitor Arm": stockLevels(4) = 18: reorderLevels(4) = 10
products(5) = "Keyboard": stockLevels(5) = 61: reorderLevels(5) = 20
alertMessage = ""
For i = 1 To 5
Select Case stockLevels(i)
Case Is <= reorderLevels(i)
alertMessage = alertMessage & products(i) & _
" — REORDER NOW" & vbNewLine
Case Is <= reorderLevels(i) + 10
alertMessage = alertMessage & products(i) & _
" — watch closely" & vbNewLine
End Select
Next i
If alertMessage = "" Then
MsgBox "All products are adequately stocked."
Else
MsgBox "Stock Alerts:" & vbNewLine & alertMessage
End If
End Sub
- Dim products(1 To 5) As String et les deux lignes similaires en dessous déclarent des tableaux — chacun étant une ligne numérotée de cinq cases plutôt qu'une seule case, donc products(1) est le nom du premier produit, products(2) le second, etc. ;
- Les cinq lignes utilisant un deux-points (
:) entre les instructions regroupent plusieurs affectations sur une seule ligne uniquement pour la lisibilité ici —products(1) = "Laptop Stand": stockLevels(1) = 58: reorderLevels(1) = 20est exactement équivalent à écrire ces instructions sur trois lignes séparées ; For i = 1 To 5 ... Next iparcourt les cinq produits un à un, en utilisant i à la fois comme compteur de boucle et comme index dans chaque tableau ;Select Case stockLevels(i)relance la même décision basée sur des plages vue dans la section 2.4, mais cette fois sur des données de tableau réelles au lieu d'un seul nombre codé en dur ;- Case Is <= reorderLevels(i) attrape tout produit dont le stock est tombé à son niveau de réapprovisionnement ou en dessous — remarquez que reorderLevels(i) est lui-même une variable, pas un nombre fixe, donc chaque produit est évalué selon son propre seuil et non un seuil unique pour tous ;
alertMessage = alertMessage & ... & vbNewLineconstruit une chaîne de caractères ligne par ligne —vbNewLineest une constante intégrée qui insère un saut de ligne, donc chaque produit signalé apparaît sur sa propre ligne dans le message final ;- Le test final
If alertMessage = "" Thendétermine laquelle des deux variantes deMsgBoxl'utilisateur verra réellement — une chaîne vide signifie que la boucle n'a rien trouvé à signaler.
Exécutez ceci et vous devriez voir le bras d'écran signalé comme « à surveiller de près » (18 unités contre un seuil de réapprovisionnement de 10) — suivez la boucle manuellement pour i = 4 si vous souhaitez confirmer exactement pourquoi c'est le seul détecté par le deuxième Case et non par le premier. Cette procédure utilise des tableaux, une boucle, un Select Case et une construction de chaîne, tous fonctionnant ensemble. C'est déjà très proche d'une logique de qualité production, simplement exécutée sur des données d'exemple saisies directement dans le code au lieu d'une vraie feuille de calcul.
Tâche
- Copiez
CheckStockLevelsdans votre classeur et exécutez-le. Vérifiez que le message correspond à la capture d'écran. - Modifiez le stock de la souris sans fil à 25 et relancez — elle devrait maintenant aussi apparaître comme « à surveiller de près ».
- Ajoutez une boucle
Do Whileen dessous qui simule la vente de 15 unités de support pour ordinateur portable à la fois jusqu'à ce que le stock tombe à 20 ou moins, en affichant le total courant dans la fenêtre Exécution après chaque vente. - Défi : réécrivez la boucle
For i = 1 To 5en utilisantFor Eachsur un tableau Variant à la place — la logique fonctionne-t-elle toujours ?
2. Modification du stock de la souris sans fil
- Repérer la ligne qui configure les données de la souris sans fil :
products(2) = "Wireless Mouse": stockLevels(2) = 134: reorderLevels(2) = 30. - Il suffit de modifier le nombre du milieu (
134) en25— laisser le nom du produit et le niveau de réapprovisionnement inchangés. - Avant d’exécuter, vérifier manuellement quel
Caseva l’attraper : est-ce que 25 ≤ 30 (le niveau de réapprovisionnement) ? Comparer cela précisément à la ligneCase Is <= reorderLevels(i), et non à la seconde.
3. Simulation de ventes par lots avec Do While
- Définir une variable pour suivre le stock du support pour ordinateur portable — l’initialiser à la même valeur déjà présente dans
stockLevels(1)(58), afin d’éviter de saisir un nouveau nombre qui pourrait ne plus correspondre au reste de la macro. - La condition de la boucle doit vérifier si le stock est toujours supérieur à 20 — dès que le contrôle trouve un stock à 20 ou moins, la boucle s’arrête.
- Soustraire 15 à chaque passage, puis afficher la nouvelle valeur juste après la soustraction — et non avant — pour que chaque nombre affiché reflète une vente effectuée.
- Faire un essai sur papier d’abord : 58 → 43 → 28 → 13. Remarquer que la dernière valeur passe sous 20 au lieu de tomber exactement dessus — c’est le même comportement de dépassement du
Do Whileillustré dans le schéma de boucle du chapitre, ce n’est pas un bug.
Point 2 — dans CheckStockLevels, il suffit de modifier un seul nombre :
products(2) = "Wireless Mouse": stockLevels(2) = 25: reorderLevels(2) = 30
Relancer la Sub.
Point 3 — ajouter ceci sous le code existant, toujours dans CheckStockLevels (avant End Sub) :
' --- Simulate selling Laptop Stand in batches of 15 ---
Dim laptopStandStock As Integer
laptopStandStock = stockLevels(1)
Do While laptopStandStock > 20
laptopStandStock = laptopStandStock - 15
Debug.Print laptopStandStock
Loop
Merci pour vos commentaires !
Demandez à l'IA
Demandez à l'IA
Posez n'importe quelle question ou essayez l'une des questions suggérées pour commencer notre discussion
Boucles
Chaque technique vue jusqu'à présent traitait une valeur à la fois. Les boucles permettent d'appliquer la même logique à de nombreuses valeurs consécutives — cinq produits, cinq cents commandes, ou autant de lignes qu'une table peut contenir — sans avoir à copier-coller le même bloc de code à répétition.
For...Next
Répète un bloc de code un nombre fixe et connu de fois :
Dim i As Long
For i = 1 To 5
Debug.Print "Row " & i
Next i
' Step lets you skip or count backward
For i = 10 To 1 Step -1
Debug.Print i
Next i
Dans la première boucle, i commence à 1, le code à l'intérieur s'exécute une fois avec cette valeur, puis i augmente automatiquement de 1 et tout le bloc s'exécute à nouveau — cela se répète jusqu'à ce que i dépasse 5, moment où la boucle s'arrête simplement et l'exécution continue après Next. Step modifie l'incrément : Step -1 compte à rebours au lieu de l'incrément par défaut de +1, et Step 2 compterait de deux en deux. La variable de boucle i n'est pas une syntaxe spéciale — c'est simplement une variable Long ordinaire que VBA met à jour à chaque passage.
For Each
Parcourt directement chaque élément d'une collection, sans avoir besoin de connaître leur nombre ou de gérer un compteur :
Dim cell As Range
For Each cell In ThisWorkbook.Worksheets("Products").Range("B2:B6")
Debug.Print cell.Value
Next cell
Ici, cell prend successivement chaque cellule individuelle de la plage B2:B6, et on lit son contenu avec .Value. À comparer avec For...Next : avec For...Next, on parcourt des nombres et on utilise ce nombre pour accéder à une valeur ; avec For Each, on parcourt directement les éléments eux-mêmes, ce qui est plus naturel lorsqu'on travaille avec des plages de feuilles de calcul.
Do While
Répète tant qu'une condition reste True — la boucle ne sait pas à l'avance combien de fois elle s'exécutera, ce qui la distingue de For...Next :
Dim stock As Integer
stock = 134
Do While stock > 0
stock = stock - 30 ' simulate selling in batches of 30
Loop
Debug.Print stock ' whatever's left after the loop stops
VBA vérifie stock > 0 avant chaque passage dans la boucle, y compris le tout premier. Suivez-le à la main : 134 → 104 → 74 → 44 → 14, puis la condition est vérifiée à nouveau — 14 est encore supérieur à 0, donc la boucle s'exécute encore une fois, arrivant à -16. Ce n'est qu'alors que stock > 0 devient finalement False, et la boucle s'arrête avec stock à -16, pas exactement à 0 ou 14. Il est important de bien suivre ce mécanisme la première fois, car c'est une source fréquente d'erreurs de dépassement : une boucle Do While continue tant que la condition est vraie au moment du test, même si l'action à l'intérieur dépasse la limite prévue.
Do Until
Il existe aussi Do Until, qui est l'image miroir de Do While — elle répète tant qu'une condition est False et s'arrête dès que cette condition devient True, au lieu de l'inverse. Le choix dépend de la façon dont on exprimerait la règle métier à l'oral : « continuer tant qu'il reste du stock » suggère Do While ; « continuer jusqu'à épuisement du stock » suggère Do Until — les deux peuvent produire un comportement identique, simplement formulé différemment.
Instructions Exit
Permettent de sortir d'une boucle prématurément, avant que la condition de fin naturelle ne soit atteinte :
For i = 1 To 100
If i = 10 Then Exit For ' stop the loop immediately
Debug.Print i
Next i
Cette boucle est prévue pour compter jusqu'à 100, mais dès que i atteint 10, Exit For l'arrête net — rien après Exit For ne s'exécute, et l'exécution passe directement à la ligne après Next i. C'est le schéma à utiliser pour parcourir une liste et s'arrêter dès qu'on a trouvé ce que l'on cherche, sans continuer inutilement à vérifier les éléments restants.
Mise en pratique
Toutes les techniques de ce chapitre — variables, opérateurs, fonctions, logique conditionnelle, et maintenant boucles — se combinent dans la procédure vers laquelle ce chapitre a convergé :
Option Explicit
Sub CheckStockLevels()
' Sample data standing in for the Products table
Dim products(1 To 5) As String
Dim stockLevels(1 To 5) As Integer
Dim reorderLevels(1 To 5) As Integer
Dim i As Long
Dim alertMessage As String
products(1) = "Laptop Stand": stockLevels(1) = 58: reorderLevels(1) = 20
products(2) = "Wireless Mouse": stockLevels(2) = 134: reorderLevels(2) = 30
products(3) = "USB-C Hub": stockLevels(3) = 44: reorderLevels(3) = 15
products(4) = "Monitor Arm": stockLevels(4) = 18: reorderLevels(4) = 10
products(5) = "Keyboard": stockLevels(5) = 61: reorderLevels(5) = 20
alertMessage = ""
For i = 1 To 5
Select Case stockLevels(i)
Case Is <= reorderLevels(i)
alertMessage = alertMessage & products(i) & _
" — REORDER NOW" & vbNewLine
Case Is <= reorderLevels(i) + 10
alertMessage = alertMessage & products(i) & _
" — watch closely" & vbNewLine
End Select
Next i
If alertMessage = "" Then
MsgBox "All products are adequately stocked."
Else
MsgBox "Stock Alerts:" & vbNewLine & alertMessage
End If
End Sub
- Dim products(1 To 5) As String et les deux lignes similaires en dessous déclarent des tableaux — chacun étant une ligne numérotée de cinq cases plutôt qu'une seule case, donc products(1) est le nom du premier produit, products(2) le second, etc. ;
- Les cinq lignes utilisant un deux-points (
:) entre les instructions regroupent plusieurs affectations sur une seule ligne uniquement pour la lisibilité ici —products(1) = "Laptop Stand": stockLevels(1) = 58: reorderLevels(1) = 20est exactement équivalent à écrire ces instructions sur trois lignes séparées ; For i = 1 To 5 ... Next iparcourt les cinq produits un à un, en utilisant i à la fois comme compteur de boucle et comme index dans chaque tableau ;Select Case stockLevels(i)relance la même décision basée sur des plages vue dans la section 2.4, mais cette fois sur des données de tableau réelles au lieu d'un seul nombre codé en dur ;- Case Is <= reorderLevels(i) attrape tout produit dont le stock est tombé à son niveau de réapprovisionnement ou en dessous — remarquez que reorderLevels(i) est lui-même une variable, pas un nombre fixe, donc chaque produit est évalué selon son propre seuil et non un seuil unique pour tous ;
alertMessage = alertMessage & ... & vbNewLineconstruit une chaîne de caractères ligne par ligne —vbNewLineest une constante intégrée qui insère un saut de ligne, donc chaque produit signalé apparaît sur sa propre ligne dans le message final ;- Le test final
If alertMessage = "" Thendétermine laquelle des deux variantes deMsgBoxl'utilisateur verra réellement — une chaîne vide signifie que la boucle n'a rien trouvé à signaler.
Exécutez ceci et vous devriez voir le bras d'écran signalé comme « à surveiller de près » (18 unités contre un seuil de réapprovisionnement de 10) — suivez la boucle manuellement pour i = 4 si vous souhaitez confirmer exactement pourquoi c'est le seul détecté par le deuxième Case et non par le premier. Cette procédure utilise des tableaux, une boucle, un Select Case et une construction de chaîne, tous fonctionnant ensemble. C'est déjà très proche d'une logique de qualité production, simplement exécutée sur des données d'exemple saisies directement dans le code au lieu d'une vraie feuille de calcul.
Tâche
- Copiez
CheckStockLevelsdans votre classeur et exécutez-le. Vérifiez que le message correspond à la capture d'écran. - Modifiez le stock de la souris sans fil à 25 et relancez — elle devrait maintenant aussi apparaître comme « à surveiller de près ».
- Ajoutez une boucle
Do Whileen dessous qui simule la vente de 15 unités de support pour ordinateur portable à la fois jusqu'à ce que le stock tombe à 20 ou moins, en affichant le total courant dans la fenêtre Exécution après chaque vente. - Défi : réécrivez la boucle
For i = 1 To 5en utilisantFor Eachsur un tableau Variant à la place — la logique fonctionne-t-elle toujours ?
2. Modification du stock de la souris sans fil
- Repérer la ligne qui configure les données de la souris sans fil :
products(2) = "Wireless Mouse": stockLevels(2) = 134: reorderLevels(2) = 30. - Il suffit de modifier le nombre du milieu (
134) en25— laisser le nom du produit et le niveau de réapprovisionnement inchangés. - Avant d’exécuter, vérifier manuellement quel
Caseva l’attraper : est-ce que 25 ≤ 30 (le niveau de réapprovisionnement) ? Comparer cela précisément à la ligneCase Is <= reorderLevels(i), et non à la seconde.
3. Simulation de ventes par lots avec Do While
- Définir une variable pour suivre le stock du support pour ordinateur portable — l’initialiser à la même valeur déjà présente dans
stockLevels(1)(58), afin d’éviter de saisir un nouveau nombre qui pourrait ne plus correspondre au reste de la macro. - La condition de la boucle doit vérifier si le stock est toujours supérieur à 20 — dès que le contrôle trouve un stock à 20 ou moins, la boucle s’arrête.
- Soustraire 15 à chaque passage, puis afficher la nouvelle valeur juste après la soustraction — et non avant — pour que chaque nombre affiché reflète une vente effectuée.
- Faire un essai sur papier d’abord : 58 → 43 → 28 → 13. Remarquer que la dernière valeur passe sous 20 au lieu de tomber exactement dessus — c’est le même comportement de dépassement du
Do Whileillustré dans le schéma de boucle du chapitre, ce n’est pas un bug.
Point 2 — dans CheckStockLevels, il suffit de modifier un seul nombre :
products(2) = "Wireless Mouse": stockLevels(2) = 25: reorderLevels(2) = 30
Relancer la Sub.
Point 3 — ajouter ceci sous le code existant, toujours dans CheckStockLevels (avant End Sub) :
' --- Simulate selling Laptop Stand in batches of 15 ---
Dim laptopStandStock As Integer
laptopStandStock = stockLevels(1)
Do While laptopStandStock > 20
laptopStandStock = laptopStandStock - 15
Debug.Print laptopStandStock
Loop
Merci pour vos commentaires !