Programmer dans le tableur (VBA) : les boucles et les programmes de gestion complets
À retenir
Cadre programme : DCG, programme 2025 (arrêté du 4 août 2025, première session 2027), UE 8 « Systèmes d'information de gestion », partie 2 « Gérer des données du système d'information », sous-partie 2.2.3 « Mettre en œuvre des programmes au sein du tableur » (exécuter, modifier ou compléter le code d'une macro-commande, fonction ou procédure ; familles d'instructions : affectation, entrée, calcul, cumul et sortie, tests, boucles (structures itératives)). Le programme limite l'étude à des programmes simples, avec les objets fondamentaux, sans classe personnalisée, sans application complexe ni optimisation avancée.
Pourquoi c'est central à l'examen : traiter une liste de clients, de factures ou de ventes, ligne après ligne, est le cas type d'un programme de gestion : relances, commissions, totaux conditionnels. Le candidat doit pouvoir dérouler une boucle à la main (tableau de suivi des variables), la corriger et compléter des lignes manquantes. Cette fiche s'appuie sur les cours 32 (variables, affectation, objets) et 33 (tests).
À retenir
Rappel de cadrage : le programme ne demande ni pseudo-code ni algorithmique abstraite : tout est écrit dans le langage de macros du tableur (VBA).
01Pourquoi des boucles
Une boucle (structure itérative) répète un bloc d'instructions. Sans boucle, traiter 12 ventes demande 12 fois la même ligne, et le programme ne s'adapte pas à une 13e vente. Avec une boucle, le même bloc traite une liste de n'importe quelle longueur.
| Boucle | Quand l'utiliser |
|---|---|
For ... Next | Le nombre de passages est connu (ligne 2 à ligne 13) |
Do While ... Loop | On répète tant que une condition est vraie (tant que la cellule n'est pas vide) |
Do Until ... Loop | On répète jusqu'à ce que une condition devienne vraie |
For Each ... Next | On parcourt chaque élément d'une plage ou d'une collection |
02La boucle For ... Next
For i = 2 To 13
' instructions répétées pour i = 2, 3, ..., 13
Next i
| Élément | Rôle |
|---|---|
i | Le compteur (variable de type Long) |
2 To 13 | Valeur de départ et valeur finale, incluse |
Step | Pas d'incrémentation (1 par défaut) : For i = 10 To 1 Step -3 donne 10, 7, 4, 1 |
Next i | Fin de boucle : le compteur passe à la valeur suivante |
Points à connaître :
- si la valeur de départ dépasse la valeur finale (avec un pas positif), la boucle ne s'exécute jamais ;
- on ne modifie pas le compteur à l'intérieur de la boucle ;
- après la boucle, le compteur vaut la valeur finale plus un pas (ici 14) ;
- on lit une cellule dont la ligne varie avec
Cells(i, 4), lignei, colonne 4 (cours 32).
Exit For quitte la boucle immédiatement (par exemple dès que l'élément cherché est trouvé).
03Les boucles Do ... Loop
3.1 Test avant : Do While et Do Until
Do While ws.Cells(ligne, 1).Value <> "" ' tant que la cellule de la colonne A n'est pas vide
' traitement de la ligne
ligne = ligne + 1 ' ne pas oublier d'avancer
Loop
Do Until condition répète jusqu'à ce que la condition devienne vraie : Do Until ws.Cells(ligne, 1).Value = "" est équivalent à la boucle précédente.
Le test est fait avant chaque passage : si la condition est fausse d'emblée (liste vide), la boucle ne s'exécute pas.
3.2 Test après : Loop While et Loop Until
Do
' instructions
Loop Until condition
Le bloc s'exécute au moins une fois, puis le test décide de recommencer. Utile pour redemander une saisie tant qu'elle est invalide.
3.3 Le danger de la boucle infinie
Une boucle Do dont la condition ne devient jamais fausse ne s'arrête pas. La cause la plus fréquente : oublier de faire avancer la variable testée (ligne = ligne + 1). On interrompt alors l'exécution par la touche d'interruption du clavier (variable selon les systèmes), au prix d'un classeur qui ne répond plus un instant. D'où la règle : avant d'exécuter, vérifier que la condition d'arrêt finira par être atteinte.
04Parcourir une liste
4.1 Jusqu'à la première cellule vide
C'est la méthode la plus courante : on avance ligne par ligne tant que la première colonne contient quelque chose.
ligne = 2 ' la ligne 1 porte les en-têtes
Do While ws.Cells(ligne, 1).Value <> ""
' ... traitement de la ligne
ligne = ligne + 1
Loop
Condition : la liste ne comporte aucune cellule vide au milieu ; sinon la boucle s'arrête trop tôt.
4.2 Avec For Each
For Each cel In Range("B2:B6")
' cel représente tour à tour B2, B3, ..., B6
Next cel
La variable cel est de type Range (un objet). Pour atteindre la cellule voisine, on utilise cel.Offset(décalage_de_lignes, décalage_de_colonnes) : cel.Offset(0, 1) est la cellule à droite, cel.Offset(0, -1) celle de gauche.
4.3 Trouver la dernière ligne
Variante, pour appliquer un For ... Next à une liste de longueur inconnue : derniere = Cells(Rows.Count, 1).End(xlUp).Row donne le numéro de la dernière ligne remplie de la colonne A. On écrit alors For i = 2 To derniere.
05Les schémas de traitement
Presque tous les programmes de gestion reprennent les mêmes motifs. Chacun repose sur une initialisation avant la boucle et une mise à jour dans la boucle.
| Motif | Avant la boucle | Dans la boucle | Après la boucle |
|---|---|---|---|
| Cumul (somme) | total = 0 | total = total + valeur | Utiliser total |
| Compteur | nb = 0 | nb = nb + 1 (souvent sous condition) | Utiliser nb |
| Maximum | maxi = première valeur (ou une valeur très petite) | If valeur > maxi Then maxi = valeur | Utiliser maxi |
| Minimum | mini = première valeur | If valeur < mini Then mini = valeur | Utiliser mini |
| Moyenne | Cumul et compteur | Les deux motifs ci-dessus | moyenne = total / nb, si nb > 0 |
| Recherche | trouve = False | If condition Then trouve = True : Exit For | Tester trouve |
Deux erreurs classiques : oublier l'initialisation (un cumul qui doit repartir de zéro plusieurs fois, ou une variable déclarée en tête de module, garde son ancienne valeur ; un maximum laissé à 0 se révèle faux sur des valeurs négatives) et diviser par un compteur nul pour une moyenne.
06La structure d'un programme de gestion complet
- Déclarations (
Dim) avec les types et des commentaires. - Entrées et initialisations : lecture des paramètres (date de référence, taux), mise à zéro des cumuls et compteurs.
- Boucle de traitement : lecture de la ligne, tests, calculs, écriture du résultat, cumuls.
- Sorties : message récapitulatif, écriture des totaux.
Pour interpréter un programme à l'écrit, on construit un tableau de suivi : une colonne par variable, une ligne par passage dans la boucle, en recopiant les valeurs après chaque instruction qui les modifie.