La boucle For…Next reste la structure itérative la plus utilisée dans les macros Excel. Sa syntaxe paraît simple, mais les erreurs de performance et de lisibilité apparaissent dès que le volume de données dépasse quelques centaines de lignes. Les pratiques qui fonctionnaient sur un petit tableau ne tiennent plus face à des fichiers de plusieurs milliers de lignes, et les guides de 2026 sur l’optimisation VBA insistent désormais sur des réflexes précis.
Profilage des boucles VBA : mesurer avant d’optimiser
La plupart des articles sur la boucle For en VBA se concentrent sur la syntaxe ou les variantes (Step, For Each). Ils laissent de côté une étape que les guides récents présentent comme un prérequis : mesurer le temps d’exécution de chaque boucle avant de toucher au code.
A lire également : Comment automatiser les tâches sur Excel ?
Le principe est direct. On encadre la boucle avec deux appels à la fonction Timer, on stocke la différence, et on affiche le résultat dans la fenêtre Exécution ou dans une cellule dédiée. Voici la structure de base :
Dim tStart As DoubletStart = TimerFor i = 1 To n ' instructionsNext iDebug.Print "Durée : " & Timer - tStart & " s"
A lire également : Comment obtenir l'OCR à partir d'un PDF ?
Ce réflexe évite un piège fréquent : réécrire un bloc entier alors que la lenteur vient d’une seule ligne à l’intérieur de la boucle (un accès cellule par cellule, un recalcul non désactivé). Profiler d’abord, optimiser ensuite – c’est l’ordre que recommandent les ressources techniques récentes.

Lecture et écriture en mémoire avec un tableau Variant
Le gain de performance le plus documenté en 2026 pour les boucles For VBA concerne la suppression des allers-retours entre le code et la feuille Excel. Chaque instruction du type Cells(i, 1).Value dans une boucle déclenche un échange avec l’objet Range, ce qui ralentit la macro de façon significative sur de gros volumes.
Charger les données dans une variable tableau
La technique consiste à copier l’intégralité de la plage dans un tableau de type Variant, à traiter les données en mémoire, puis à réécrire le résultat en une seule opération. Le schéma ressemble à ceci :
Dim arr As Variantarr = Range("A1:D5000").Value2For i = LBound(arr, 1) To UBound(arr, 1) arr(i, 2) = arr(i, 1) * 1.2Next iRange("A1:D5000").Value2 = arr
L’utilisation de .Value2 plutôt que .Value évite la conversion automatique des dates et des devises, ce qui accélère encore la lecture. Traiter les données en mémoire plutôt que cellule par cellule est présenté dans les guides actuels comme la technique de base de haute performance en VBA.
Ce que ce changement implique dans la structure du code
Adopter cette approche oblige à repenser la boucle. On ne manipule plus des objets Range à chaque itération, mais des indices de tableau. Le code devient plus lisible et plus prévisible, car il ne dépend plus de l’état de la feuille pendant l’exécution.
Type du compteur de boucle For : Long plutôt qu’Integer
Un détail de déclaration qui a des conséquences mesurables : le type de la variable compteur. Déclarer Dim i As Integer limite la plage à 32 767 et, sur les versions récentes d’Excel en environnement 64 bits, n’apporte aucun avantage mémoire par rapport à Long.
Les guides d’optimisation VBA publiés en 2026 recommandent explicitement Long (ou LongPtr en 64 bits) pour tout compteur de boucle. Le type Integer est converti en interne en Long par le moteur VBA, ce qui ajoute une opération inutile à chaque itération.
Dim i As Longcouvre les plages jusqu’à plus de deux milliards de lignes, ce qui suffit largement pour toute feuille Excel.LongPtrs’adapte automatiquement à l’architecture (32 ou 64 bits) et convient aux appels API.- Éviter
Variantcomme type de compteur : le moteur VBA effectue alors un typage dynamique à chaque passage dans la boucle, ce qui dégrade la performance sans apporter de flexibilité utile.

Désactiver les recalculs et l’affichage pendant la boucle
Deux propriétés d’Application reviennent dans toutes les recommandations de performance VBA, mais elles sont souvent placées au mauvais endroit ou oubliées dans les blocs de gestion d’erreur.
Avant d’entrer dans une boucle For qui modifie des cellules, désactiver :
Application.ScreenUpdating = Falsepour suspendre le rafraîchissement visuel de la feuille.Application.Calculation = xlCalculationManualpour empêcher Excel de recalculer les formules à chaque écriture.Application.EnableEvents = Falsesi des événements Worksheet_Change sont définis, afin d’éviter des déclenchements en cascade.
Le piège classique : ne pas réactiver ces propriétés dans un bloc de gestion d’erreur. Si la macro plante entre le False et le True, Excel reste figé ou en calcul manuel jusqu’à la prochaine intervention manuelle. La bonne pratique consiste à placer la réactivation dans une section On Error GoTo avec un label de sortie, pour garantir le rétablissement quel que soit le scénario d’exécution.
Boucle For à décrémentation : suppression de lignes sans décalage
Supprimer des lignes dans une boucle For classique (de 1 vers n) provoque un décalage d’indices : après suppression de la ligne 5, l’ancienne ligne 6 devient la ligne 5, et le compteur saute une ligne. Ce bug silencieux laisse des données non traitées sans générer d’erreur.
La solution est la boucle à décrémentation, avec un Step négatif :
For i = LastRow To 1 Step -1 If Cells(i, 3).Value = "" Then Rows(i).DeleteNext i
Parcourir le tableau de bas en haut élimine le problème de décalage. Chaque suppression n’affecte que des lignes déjà traitées. Cette technique, souvent méconnue des débutants en VBA, est documentée comme la méthode standard pour toute opération de suppression conditionnelle dans une boucle For.
En revanche, si le volume de lignes à supprimer est très important, filtrer la plage avec AutoFilter puis supprimer les lignes visibles en une seule opération sera nettement plus rapide qu’une boucle, même décrémentée.
Les boucles For en VBA Excel ne posent pas de difficulté syntaxique. Les problèmes apparaissent à l’échelle : compteur mal typé, accès cellule par cellule, recalcul non maîtrisé. Appliquer systématiquement le profilage, le traitement en mémoire et la gestion propre des propriétés Application suffit à couvrir la grande majorité des cas rencontrés dans les macros de gestion courante.