Tout savoir sur les boucles For … Next et For ... Each en VBA [#15 FORMATION EXCEL VBA COMPLETE]

Guide « 108 astuces pour grands débutants sur Excel ! » Offert
Booster votre productivité en téléchargeant gratuitement votre ebook PDF des meilleures astuces pour les débutants et les pros d'Excel
Excel formation - 00 Astuces - 100
 

En règle générale, un code informatique, et cela quel qu’en soit son langage de développement est constitué de décisions qui orientent les différentes actions à mettre en place au travers des outils If…Then et Select…Case que nous avons abordés dans le chapitre précédent. À présent, nous allons également découvrir qu’il est nécessaire de mettre en place des successions de tâches qui vont être répétées plusieurs fois de suite.

 

Téléchargement

Vous pouvez obtenir le fichier d'exemple de cet article et découvrir la méthode d'apprentissage de VBA pas-à-pas en cliquant sur le lien suivant :

APPRENDRE VBA POUR LES GRANDS DEBUTANTS

Tutoriel Vidéo

Partie 1 : Découvrir la boucle For... Next

Partie 2 : Découvrir la boucle For Each... 

 

Vous trouverez très régulièrement de nouvelles vidéos sur la chaîne, alors pensez à vous abonner pour ne manquer aucune astuce et devenir rapidement un pro d’Excel (cliquez-ici) !

 

1. Présentation

Ces répétitions sont rendues possibles grâce à la mise en place de boucles, et la plus courante d’entre elles est la boucle for…next (« tant que… ») :

 

For i = 1 To 10
     ' Action répétée
Next i

 

Une boucle For s’utilise avec l’aide d’une variable à laquelle nous donnons une valeur minimale (ici la variable i a pour valeur 1).

Ensuite nous spécifions que nous souhaitons exécuter une portion de code tant que la valeur de i est inférieure ou égale à 10 (To 10).

Et enfin après avoir inséré le code que nous voulons répéter, nous fermons notre boucle grâce au mot clé Next.

De cette manière, la valeur de la variable i est incrémentée d’une unité (il s’agit de l’incrémentation par défaut, que nous pourrons modifier grâce à la propriété Step, que nous verrons un peu plus tard), puis si la nouvelle valeur est toujours comprise dans la plage de répétition, alors le déroulement du code reprend directement au début de la boucle.

Dans le cas contraire, alors le déroulement continue sur les lignes situées en dessous du Next.

 

2. Exemple

Imaginons par exemple que nous souhaitions afficher cinq fois une notification à l’utilisateur.

En VBA, nous pourrions saisir cinq fois la même ligne :

Sub exempleBoucleForNext()
        MsgBox "Notification 1"
        MsgBox "Notification 2"
        MsgBox "Notification 3"
        MsgBox "Notification 4"
        MsgBox "Notification 5"
End Sub

 

Evidemment, cette manière de procéder n’a rien d’optimisée. En effet, si ici nous ne faisons que répéter cinq fois une opération, nous pourrions facilement imaginer un exemple dans lequel nous le ferions plusieurs centaines, ou même milliers de fois.

Nous allons simplement pouvoir utiliser une boucle For !

Sub exempleBoucleForNext()
        Dim i As Integer
        For i = 1 To 5
            MsgBox "Notification 1"
        Next i
End Sub

 

Comme vous pouvez le voir, nous commençons ici par créer une variable i de type Integer que nous utiliserons ensuite pour faire fonctionner la boucle (je vous conseille en effet de toujours déclarer vos variables).

Puis nous créons la boucle en paramétrant une valeur de 1 pour la variable i, et étant donné que nous souhaitons afficher le message à cinq reprises, nous définissons une valeur maximale de 5 (For i = 1 To 5).

Et nous terminons la boucle par Next i, ce qui permet de retourner sur la première ligne.

Notez que nous pourrions saisir simplement Next, sans préciser d’incrémenter la variable i, celle-ci étant implicite.

Excel formation - VBA15 - Boucle for - 01

Alors évidemment, ici nous affichons EXACTEMENT le même message à cinq reprises : « Notification 1 ».

Mais tout l’intérêt d’une boucle For réside justement dans le fait que nous pouvons très simplement exploiter la variable incrémentée dans notre code. Pour cela, il suffit concaténer la chaîne affichée avec l’esperluette (« & ») :

 

Sub exempleBoucleForNext()
        Dim i As Integer
        For i = 1 To 5
            MsgBox "Notification " & i
        Next
End Sub

 

Excel formation - VBA15 - Boucle for - 02

3. Modifier le pas

Dans l’exemple que nous venons de voir, je vous ai expliqué que par défaut lorsque la boucle se termine, la valeur de la variable utilisé s’incrémente d’une unité.

Parfois nous allons souhaiter modifier ce comportement afin par exemple de faire en sorte que celle-ci augmente de dix unités.

Pour cela, nous avons à disposition le paramètre Step :

 

Sub exempleBoucleForNext()
        Dim i As Integer
        For i = 10 To 50 Step 10
            MsgBox "Notification " & i
        Next
    End Sub

 

Excel formation - VBA15 - Boucle for - 03

La notification a ici pour valeur 10, puis 20, … jusqu’à 50.

 

4. Inverser la boucle

Pour inverser la boucle, il suffit simplement d’initialiser la boucle avec une valeur de début supérieur à la valeur finale et de spécifier un Step négatif :

 

Sub exempleBoucleForNext()
        Dim i As Integer
        For i = 5 To 1 Step -1
            MsgBox "Notification " & i
        Next
    End Sub

 

Excel formation - VBA15 - Boucle for - 04

 

5. Imbriquer des boucles dans des boucles

Il est tout à fait possible d’imbriquer des boucles dans d’autres boucles, dans ce cas, il faut être vigilant dans l’utilisation de la variable qui sert de compteur pour ne pas créer de conflit entre les différents niveaux de boucles.

Voici un exemple de boucle for imbriquée dans une seconde :

 

Sub exempleBoucleForImbriquées()
        Dim x As Integer, y As Integer
        
        For x = 1 To 9
            For y = 1 To 9
                Feuil16.Cells(y + 7, x) = x * y
            Next
        Next
    End Sub

 

Ici, nous affichons le résultat des tables de multiplications des nombres 1 à 9 dans un tableau :

Excel formation - VBA15 - Boucle for - 05

 

6. Quitter une boucle avant la fin !

Il existe deux méthodes pour quitter une boucle avant que la variable de test n’atteigne le résultat maximal attendu :

Soit modifier directement la valeur de la variable (par exemple en saisissant une ligne x = 1000), mais dans ce cas, la boucle ira quand jusque au bout de son exécution actuelle et le code n’en sortira que lorsqu’il arrivera au niveau de la ligne contenant le mot-clé Next :

 

Sub exempleBoucleForImbriquées()
        Dim x As Integer, y As Integer
        
        For x = 1 To 9
            For y = 1 To 9
                If x * y > 50 Then x = 1000
                Feuil16.Cells(y + 7, x) = x * y
            Next
        Next
    End Sub

 

Excel formation - VBA15 - Boucle for - 06

Ici la cellule ALL16 est modifiée pour prendre la valeur de 9000 (1000 * 9) !

Soit utiliser une instruction Exit For et dans ce cas, le code sort immédiatement de la boucle sans en exécuter la suite :

Sub exempleBoucleForImbriquées()

        Dim x As Integer, y As Integer
        
        For x = 1 To 9
            For y = 1 To 9
                If x * y > 50 Then Exit For
                Feuil16.Cells(y + 7, x) = x * y
            Next
        Next
End Sub

 

Excel formation - VBA15 - Boucle for - 07

Vous noterez au passage qu’ici l’instruction Exit For a été saisie dans la boucle imbriquée, c’est donc celle-ci qui est quittée, mais relancée juste après par la boucle principale.

 

7. Attention au piège !

Attention en effet, car comme nous venons de le voir juste avant, il est possible de modifier simplement la valeur de la variable directement dans le code de la boucle.

Il faut alors prendre toutes les précautions afin de ne pas générer des bugs qui auraient pour conséquence de rendre nos macros simplement inutilisables !

Sub exempleBoucleForNext()
        Dim i As Integer
        For i = 5 To 1 Step -1
            MsgBox "Notification " & i
            i = 3
        Next
    End Sub

 

Ici nous rétablissons systématiquement la valeur de i à 3, notre code ne pourra donc jamais arriver à son terme !

 

8. La variante For … Each pour boucler sur une collection

 

8.1. Découverte de For … Each

 

Maintenant que nous avons découvert comment réaliser une simple boucle qui se répète tant qu’une condition est remplie, je vais vous montrer une variante de la boucle For, qui va nous permettre de passer en revue chacun des objets appartenant à une collection.

Nous avons déjà abordé la notion d’objet dans un chapitre précédent de la formation sur l’apprentissage de VBA. Nous avions alors défini un objet comme étant « en quelque sorte une super variable qui est elle-même composée de propriétés (c’est-à-dire des variables propres à cet objet) et méthodes (c’est-à-dire des procédures qui permettent d’agir sur cet objet). ». Nous avions également vu qu’une collection permet de regrouper un ensemble d’objet d’un même type.

Bien évidemment, si vous souhaitez en savoir plus sur ces notions que nous ne faisons ici que survoler, je vous invite vivement à consulter cet article si vous ne l’avez pas déjà fait.

L’exemple le plus parlant de collection d’objet que nous manipulons très souvent sans même nous en rendre compte est la plage de cellules (Range) qui est composée d’un ensemble d’objets qui correspond aux cellules.

Grâce à l’instruction For … Each, nous allons ainsi pouvoir passer en revue chacune des cellules appartenant à une plage pour effectuer un traitement sur celles-ci.

 

8.2. Lire les cellules sélectionnées

 

Prenons l’exemple de la plage des cellules retournées par la sélection :

 

Sub lireCellulesSelectionnées()
        Dim cellule As Range
        For Each cellule In Selection
            MsgBox cellule
        Next
    End Sub

 

Ici, nous commençons par créer une variable cellule typée en tant que Range qui va ensuite nous servir à passer en revue chacune des cellules sélectionnées.

Ensuite nous utilisons le For Each, que nous pourrions traduire par : « Pour toutes les cellules contenues dans la sélection » (« For Each cellule in Selection »).

Cela permet deux choses :

  • Tout d’abord créer une boucle qui va se répéter autant de fois qu’il y a de cellules dans la sélection,
  • Affecter chacune des cellules à tour de rôle à la variable cellule

Enfin, il ne reste plus qu’à effectuer un traitement sur la cellule en cours d’affectation : ici nous nous contentons d’en afficher la valeur dans une boîte de notification (via MsgBox).

Une autre collection de VBA forte utile est la collection Worksheets, qui contient l’ensemble des objets Worksheet (c’est-à-dire les feuilles de calculs) du classeur. Cela peut par exemple permettre de créer un sommaire automatique.

 

8.3. Créer un sommaire automatique

 

Cet exemple est inspiré de l’article « Comment créer un sommaire automatique et généré en 1 clic sur Excel » que vous retrouverez en cliquant ici :

 

Sub créerSommaire()
        Dim cellule As Range ' 1
        Set cellule = Feuil16.[a21] ' 2
        
        Dim feuille As Worksheet ' 3
        For Each feuille In Worksheets ' 4
            ActiveSheet.Hyperlinks.Add anchor:=cellule,  Address:="", SubAddress:="'" & feuille.Name &  "'!A1", TextToDisplay:=feuille.Name ' 5
            Set cellule = cellule.Offset(1, 0) ' 6
        Next ' 7
    End Sub

 

Pour faire simple :

  • 1 : Nous commençons par créer une variable de type Range que nous nommons cellule, et qui va nous permettre de nous déplacer dans la feuille de calcul actuelle afin de venir y saisir les différents liens du sommaire.
  • 2 : Nous affectons la cellule A21 de la feuille 16 à cette cellule,
  • 3 : Puis nous créons une seconde variable qui est cette fois-ci typée en tant que Worksheet, c’est-à-dire une feuille de calcul du classeur,
  • 4 : Cette variable nous permet de passer en revue toutes les feuilles contenues dans le classeur,
  • 5 : Nous créons le lien hypertexte qui permet d’atterrir sur la cellule A1 de la feuille en cours de revue et dont le noms est retourné par la propriété feuille.Name directement sur la cellule en cours de traitement (pour plus de détail sur la création de liens hypertextes en VBA, je vous invite à consulter le tutoriel « Comment créer un sommaire automatique et généré en 1 clic sur Excel » si ce n’est pas déjà fait)
  • 6 : Cela étant fait, nous passons sur la cellule située juste en dessous pour le prochain passage de la boucle,
  • 7 : Et enfin, nous clôturons la boucle avec le mot clé habituel Next

Et voilà, comme vous pouvons le voir par cet exemple, il est très simple de créer un sommaire en quelques lignes de codes seulement !

Excel formation - VBA15 - Boucle for - 08

 

8.4. Lire les éléments d’un tableau

 

Enfin sachez que l’instruction For … Each ne se limite à énumérer les différents éléments contenus dans une bibliothèque, en effet celle-ci permet également de passer en revue les différents éléments d’un tableau de type Array.

Il s’agit d’une notion que nous n’avons pas encore abordé jusqu’alors. Sachez simplement qu’un Array est une variable qui a la particularité de contenir plusieurs valeurs.

Dans l’exemple que nous allons voir juste après, nous créons une variable listeFruits, laquelle contient comme son nom l’indique une suite de nom de fruits :

 

Sub lireUnTableau()
        Dim listeFruits As Variant
        listeFruits = Array("Pomme",  "Banane", "Orange")
        
        Dim fruit As Variant
        For Each fruit In listeFruits
            MsgBox fruit
        Next
    End Sub

 

L’utilisation de For … Each nous permets de récupérer chacune des valeurs de cette liste au sein d’une variable que nous avons instanciée juste avant sous le nom de fruit.

Il nous suffit ensuite d’afficher cette valeur à l’utilisateur via une MsgBox.

Note : pour pouvoir utiliser correctement l’énumération des éléments contenus dans un Array, les variables sont déclarées en tant que Variant

Ici, nous avons définis les noms à affecter à notre listeFruits directement en utilisant la fonction VBA Array().

Nous pourrions également créer de toute pièce un Array en utilisant par exemple la fonction Split() directement en tant que paramètre que For … Each.

Dans ce dernier exemple, nous énumérons chaque mot contenu dans une phrase :

 

Sub motParMot()
        Dim phrase As String
        phrase = "Bonjour et bienvenue sur  excelformation.fr"
        
        Dim mot As Variant
        For Each mot In Split(phrase, " ")
            MsgBox mot
        Next
    End Sub

 

 



Articles qui pourraient vous intéresser

Comment connecter Excel sur Internet, sans VBA ?
Comment traduire automatiquement des fonctions Excel dans leur version originale ?
Comment analyser les résultats d’un sondage ou questionnaire avec Excel ?
Comment utiliser la fonction SOMME.SI pour effectuer des recherches sur des textes sur Excel ?
Comment calculer et étudier des écarts budgétaires avec Excel ?
Comment verrouiller et protéger un objet (graphique, image, zone de texte…) sur Excel ?
Comment formater des dates correctement dans Excel ?
Comment protéger le formatage des cellules tout en autorisant la saisie de données dans Excel ?
Comment transformer une photo en tableau Excel ?
Comment créer un publipostage automatique avec Excel ? (sans Word !)
Comment créer un graphique Gaufre sur Excel ?
Comment créer un graphique en cascade dans Excel ?

Contact - Plan du site - À propos - Contact

© Excelformation.fr 2018-2024 - Excel, simplement

Haut de la page

Excelformation.fr propose de nombreuses formations pratiques et gratuites sur Microsoft Excel : des cours pour apprendre à structurer et analyser les données, des tutos sur les fonctions avancées, les formules et les formules avancées d'Excel, les formules matricielles, les mise-en-formes conditionnelles, les graphiques Excel (xls, xlsx, xlsm,…). Des tutoriels pour apprendre à automatiser les tâches répétitives (via des macro-commandes en VBA) de vos classeurs Excel.