🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

VBA StatusBar dans Excel — afficher la progression d'une macro sans UserForm (et le message qui reste bloqué pour toujours)

|

VBA StatusBar dans Excel — afficher la progression d'une macro sans UserForm (et le message qui reste bloqué pour toujours)

TL;DRApplication.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 avec Application.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 = False vaut 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