TL;DR —
Application.StatusBar = "..."écrit votre propre texte dans la barre en bas à gauche de la fenêtre Excel. C'est l'indicateur de progression le plus léger qui soit — une ligne, sans UserForm, sans scintillement, et il survit àScreenUpdating = False. Le piège, c'est la réinitialisation : tout ce que vous avez écrit y reste bloqué après la fin de la macro jusqu'à ce que vous rendiez la barre à Excel avecApplication.StatusBar = False(pas une chaîne vide). Rétablissez-la dans un gestionnaire d'erreurs pour qu'un plantage ne laisse pas un message périmé épinglé à la fenêtre :
Sub LongJob()
Application.ScreenUpdating = False
On Error GoTo CleanExit
Dim i As Long, n As Long
n = 10000
For i = 1 To n
' ... traiter la ligne i ...
If i Mod 250 = 0 Then
Application.StatusBar = "Processing " & i & " of " & n & " (" & Int(i / n * 100) & "%)"
End If
Next i
CleanExit:
Application.StatusBar = False ' rendre la barre a Excel - ne la laissez PAS a ""
Application.ScreenUpdating = True
End Sub
Quand une macro tourne plus d'une seconde ou deux, la première question de l'utilisateur est « ce truc est-il encore vivant ? ». La barre d'état y répond pour le prix d'une seule ligne. Ce guide repose sur une seule idée — la barre d'état est un prêt : vous y écrivez, et vous devez la rendre. Excel ne la reprendra pas de lui-même, si bien que toute la différence entre un indicateur de progression professionnel et une fenêtre où un « Processing 73%... » figé reste incrusté tient en une seule ligne de réinitialisation.
Ce que vous allez apprendre
- Le modèle mental — la barre d'état appartient à Excel, vous l'empruntez et devez la rendre
- Le motif écrire-puis-réinitialiser, et pourquoi
= Falsevaut mieux que= "" - L'idiome du pourcentage de progression qui répond à « combien de temps encore ? »
- Pourquoi le texte ne se met pas à jour dans une boucle serrée — et où DoEvents s'insère
- Quand la ligne unique suffit et quand une vraie barre de progression en UserForm vaut son coût
- Comment elle s'associe à ScreenUpdating et au rétablissement CleanExit
Le modèle mental : la barre appartient à Excel
Par défaut, la bande en bas à gauche de la fenêtre est gérée par Excel. Elle affiche « Prêt », ou
« Calcul », ou la somme de vos cellules sélectionnées. Quand vous affectez une chaîne à
Application.StatusBar, vous prenez cet espace en main — Excel cesse d'y poster ses propres messages et
affiche les vôtres à la place. À partir de cet instant, la barre est à vous jusqu'à ce que vous la
rendiez.
La rendre tient en une ligne : Application.StatusBar = False. Cela ne se contente pas d'effacer le
texte — cela rend le contrôle à Excel, si bien que la barre se remet à afficher « Prêt » et compagnie.
C'est le seul fait qui fait trébucher tout le monde, alors autant l'énoncer clairement :
Application.StatusBar = "Working..." ' la barre vous appartient desormais
Application.StatusBar = False ' vous la rendez ; Excel la gere de nouveau
Pourquoi False, et non une chaîne vide
L'instinct, une fois terminé, est d'effacer le message : Application.StatusBar = "". Ça a l'air
propre, et c'est faux. Une chaîne vide reste votre message — un message vide. Excel continue de
s'effacer devant vous, si bien que la barre reste vide et ne revient jamais afficher « Prêt » ou la
somme de la sélection. C'est le même bug que de laisser un texte périmé, juste plus difficile à repérer,
car le symptôme est une barre d'état étrangement silencieuse plutôt qu'un message figé visible.
Application.StatusBar = False est la seule affectation qui dise « j'ai terminé, reprends-la ».
Faites-en un réflexe : la ligne qui active la barre d'état a un = False correspondant dans le
gestionnaire CleanExit, exactement comme ScreenUpdating = True.
L'idiome du pourcentage de progression
Si les gens cherchent une « barre de progression VBA », c'est presque toujours pour ceci : une boucle qui tourne assez longtemps pour que l'utilisateur ait besoin de la voir avancer. La barre d'état le fait sans aucune interface supplémentaire :
Dim i As Long, n As Long
n = UBound(data)
For i = 1 To n
' ... traitement ...
If i Mod 100 = 0 Then
Application.StatusBar = "Row " & i & " of " & n & " - " & Format(i / n, "0%")
End If
Next i
Deux détails le rendent juste. Premièrement, mettez à jour à intervalle régulier (i Mod 100 = 0),
pas à chaque itération — écrire dans la barre d'état 10 000 fois est en soi lent, et l'utilisateur ne
peut pas lire des nombres qui défilent aussi vite. Deuxièmement, montrez la progression sur un total
(i of n, un pourcentage), pas juste un indicateur qui tourne, pour que l'utilisateur puisse estimer le
temps restant. C'est la différence entre « il se passe quelque chose » et « vous en êtes aux deux
tiers ».
Pourquoi le texte ne se met pas à jour — et où DoEvents s'insère
Voici le piège qui envoie les gens sur les forums : vous définissez Application.StatusBar dans une
boucle et le texte ne change jamais à l'écran — il affiche la première valeur et se fige, alors même
que votre code le réaffecte clairement. La barre d'état, comme tout le reste, ne se repeint que
lorsqu'Excel a un instant pour traiter sa file de messages. Une boucle VBA serrée ne lui laisse jamais
cet instant, si bien que le redessin n'a jamais lieu.
Le correctif est DoEvents — il rend brièvement le contrôle à Excel pour que la barre se redessine vraiment :
If i Mod 100 = 0 Then
Application.StatusBar = "Row " & i & " of " & n
DoEvents ' laisser Excel repeindre la barre
End If
Utilisez-le au même intervalle que la mise à jour, pas à chaque itération — DoEvents a ses propres
coûts et risques de réentrance. Et notez que c'est le seul endroit où la barre
d'état se comporte mieux qu'un UserForm sous ScreenUpdating = False : la barre d'état se met à jour
sans problème même quand la mise à jour de l'écran est désactivée, alors qu'une barre de progression en
UserForm a besoin d'un .Repaint explicite.
Quand la ligne unique suffit — et quand elle ne suffit pas
Pour la grande majorité des macros, Application.StatusBar est le bon indicateur de progression, et se
rabattre sur un UserForm est de la sur-ingénierie. C'est une ligne, il ne vole pas le focus, il ne
scintille pas, et il coexiste avec ScreenUpdating = False. Préférez-le par défaut.
Une barre de progression en UserForm justifie son code supplémentaire seulement quand vous avez
spécifiquement besoin de quelque chose que la barre d'état ne peut pas offrir : une barre de remplissage
graphique, un bouton d'annulation, une ventilation sur plusieurs lignes, ou une identité visuelle
dans une boîte de dialogue que l'utilisateur ne peut pas manquer. Ce sont parfois de vrais besoins —
mais ce sont l'exception, et ils s'accompagnent de tracas de focus, de redessin et de modalité que la
barre d'état contourne entièrement. Notez aussi que Application.DisplayStatusBar doit être à True
pour que la barre soit visible tout court ; si une macro ou un réglage antérieur l'a masquée, votre
texte sera écrit mais pas affiché.
Comment ExcelMaster aide
Un bon indicateur de progression, c'est une ligne pour écrire et une ligne pour réinitialiser, plus le
jugement de mettre à jour à intervalle régulier, d'ajouter DoEvents seulement là où la barre doit se
repeindre, et de rétablir avec = False dans un gestionnaire d'erreurs pour qu'un plantage n'épingle
pas un message périmé à la fenêtre. Ratez la réinitialisation et vous livrez un classeur qui affiche
« Processing 47%... » pour toujours.
ExcelMaster met tout cela en
place pour vous. Demandez-lui d'« afficher la progression pendant que ceci s'exécute sur 50 000 lignes »,
et il écrit le pourcentage dans la barre d'état à un intervalle raisonnable, l'associe à DoEvents pour
qu'elle bouge vraiment, et réinitialise la barre avec Application.StatusBar = False dans le même
rétablissement CleanExit que ScreenUpdating — vous obtenez ainsi un indicateur de progression qui se
tient bien et nettoie après lui.
Questions fréquentes
Comment afficher une barre de progression en VBA Excel ?
La façon la plus légère est Application.StatusBar = "...", qui écrit votre texte dans la barre en bas
à gauche de la fenêtre — sans UserForm. Mettez-la à jour à intervalle régulier dans votre boucle (par
exemple If i Mod 100 = 0 Then), affichez la progression sous la forme « ligne i sur n » ou un
pourcentage, et réinitialisez-la avec Application.StatusBar = False en terminant. Une barre de
progression graphique en UserForm ne vaut le code supplémentaire que lorsque vous avez besoin d'une
barre de remplissage ou d'un bouton d'annulation.
Comment réinitialiser Application.StatusBar en VBA ?
Mettez Application.StatusBar = False. Cela rend le contrôle de la barre à Excel pour qu'elle affiche
de nouveau « Prêt » et ses propres messages. N'utilisez pas Application.StatusBar = "" — une
chaîne vide reste votre message, donc Excel continue de s'effacer devant vous et la barre reste vide au
lieu de reprendre son comportement normal.
Pourquoi le texte de ma barre d'état ne se met-il pas à jour pendant l'exécution de la macro ?
Parce qu'une boucle VBA serrée ne laisse jamais Excel traiter sa file de messages, donc la barre ne se
repeint jamais. Ajoutez DoEvents juste après avoir défini le texte (au même
intervalle que la mise à jour) pour donner à Excel un instant pour le redessiner. Contrairement à une
barre de progression en UserForm, la barre d'état se met bien à jour avec ScreenUpdating = False.
La barre d'état fonctionne-t-elle avec ScreenUpdating désactivé ?
Oui. Application.StatusBar se met à jour même quand Application.ScreenUpdating = False, ce qui est
l'une des raisons pour lesquelles c'est un meilleur choix par défaut qu'une barre de progression en
UserForm pour les macros longues. Vous pourriez tout de même avoir besoin de DoEvents pour que le
texte se repeigne à l'intérieur d'une boucle serrée. Assurez-vous aussi que Application.DisplayStatusBar
est à True, sinon la barre est masquée et votre texte n'apparaîtra pas.
StatusBar face à une barre de progression en UserForm — laquelle choisir ?
Utilisez Application.StatusBar pour presque tout : c'est une ligne, sans scintillement, sans vol de
focus, et elle survit à ScreenUpdating = False. Ne construisez une barre de progression en UserForm
que lorsque vous avez spécifiquement besoin d'une barre de remplissage graphique, d'un bouton
d'annulation, ou d'un état sur plusieurs lignes que la barre à une seule ligne ne peut pas afficher.
Testé dans
Testé dans : Excel 365 (Windows 11), VBA 7.1 — dernière vérification le 18/08/2026.
Guides associés : VBA DoEvents · VBA DisplayAlerts · VBA ScreenUpdating · VBA On Error · VBA MsgBox
