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

VBA ScreenUpdating dans Excel — supprimer le scintillement et accélérer les macros (et pourquoi ça ne réparera pas une macro lente)

|

VBA ScreenUpdating dans Excel — supprimer le scintillement et accélérer les macros (et pourquoi ça ne réparera pas une macro lente)

TL;DRApplication.ScreenUpdating = False dit à Excel de cesser de repeindre l'écran pendant l'exécution de votre macro et de le redessiner une seule fois à la fin. Cela supprime le scintillement et apporte un gain de vitesse modéré — mais seulement quand votre code écrit dans des cellules, sélectionne ou fait défiler. Cela ne change rien à une macro lente à cause d'un recalcul ou d'entrées-sorties de fichier. Remettez-le à True quand vous avez fini, et ne comptez jamais sur une réinitialisation automatique — un plantage peut laisser l'écran figé et grisé :

Sub PaintRows()
    Application.ScreenUpdating = False        ' cesser de repeindre - plus de scintillement
    On Error GoTo CleanExit                    ' pour qu'un plantage ne bloque pas l'ecran
    Dim i As Long
    For i = 2 To 5000
        Cells(i, 1).Interior.Color = IIf(i Mod 2 = 0, RGB(240, 240, 240), vbWhite)
    Next i
CleanExit:
    Application.ScreenUpdating = True         ' toujours retablir, meme apres une erreur
End Sub

Chaque fois que votre macro modifie une cellule, Excel veut redessiner l'écran pour l'afficher. Faites cela 5 000 fois et vous payez 5 000 redessins que l'utilisateur n'avait aucun besoin de voir. ScreenUpdating = False les regroupe en un seul redessin à la fin. Ce guide repose sur une seule idée — ScreenUpdating est un interrupteur de redessin, pas un interrupteur de vitesse magique. Il supprime le travail de redessin, et uniquement le travail de redessin. Comprenez cela et vous saurez exactement quand il aide, quand c'est une ligne gâchée, et pourquoi le laisser désactivé après un plantage est le vrai danger.

Ce que vous allez apprendre

  • Le modèle mental — Excel repeint après chaque changement ; cet interrupteur regroupe les redessins en un seul
  • Où il aide vraiment — écrire, sélectionner, faire défiler — et où il ne fait rien
  • La règle qui compte le plus — un plantage peut laisser l'écran bloqué, alors rétablissez-le dans un gestionnaire d'erreurs
  • Le piège du scintillement dû au rétablissement imbriqué — pourquoi l'écran scintille encore après l'avoir désactivé
  • Comment il s'associe à Calculation et EnableEvents
  • ScreenUpdating face à DisplayStatusBar et aux autres interrupteurs cosmétiques

Le modèle mental : Excel repeint après chaque changement

Par défaut, Excel garde l'écran synchronisé avec le classeur en temps réel. Votre macro définit A1, Excel repeint ; elle définit A2, Excel repeint de nouveau. Chaque redessin est peu coûteux isolément, mais dans une boucle qui touche des milliers de cellules, ce sont les redessins qui dominent — et vous voyez l'écran s'agiter à mesure que la macro gribouille le long de la feuille.

Application.ScreenUpdating = False suspend cela. Excel continue de mettre à jour le classeur en mémoire mais cesse de le dessiner. Quand vous remettez la propriété à True (ou que la macro se termine), Excel repeint une seule fois, et le résultat final apparaît d'un seul coup net. L'utilisateur voit l'avant et l'après, jamais le scintillement entre les deux.

Application.ScreenUpdating = False   ' Excel cesse de dessiner (il continue de travailler)
' ... des milliers d'ecritures de cellules se font de maniere invisible ...
Application.ScreenUpdating = True    ' un seul redessin montre l'etat final

Où il aide vraiment — et où il ne fait rien

C'est la partie que la plupart des tutoriels sautent, et c'est tout l'intérêt. ScreenUpdating supprime le travail de redessin. Si votre macro est lente pour une autre raison, la désactiver ne change rien.

Il aide beaucoup quand votre code :

  • écrit dans de nombreuses cellules en boucle,
  • utilise .Select / .Activate (chaque sélection est un redessin),
  • fait défiler, ou modifie ce qui est visible à l'écran.

Il ne fait rien quand votre macro est lente à cause de :

  • un recalcul lourd après chaque écriture — c'est le rôle de Calculation,
  • la lecture ou l'écriture de fichiers, l'interrogation d'une base de données ou l'appel d'un service web,
  • un travail purement en mémoire sur des tableaux et des variables (il n'y a rien à redessiner).

Donc si vous avez ajouté ScreenUpdating = False et que la macro reste lente, vous avez saisi le mauvais interrupteur. Le plus grand gain de vitesse dans la vraie vie n'est en général pas celui-ci du tout — c'est remplacer une boucle cellule par cellule par une seule lecture de tableau et une seule écriture de tableau, ce qui supprime les redessins et le surcoût par cellule d'un même geste. ScreenUpdating est la touche finale par-dessus cela, pas le correctif à lui seul.

La règle qui compte le plus : un plantage peut laisser l'écran bloqué

Voici la défaillance que tout le monde rencontre. Vous mettez ScreenUpdating = False, votre macro plante à mi-parcours, et l'exécution s'arrête — avant la ligne qui le réactive. Excel se retrouve alors avec la mise à jour de l'écran désactivée. La fenêtre paraît figée, à moitié dessinée, ou tout simplement grise ; des images fantômes de boîtes de dialogue s'attardent. Les utilisateurs forcent la fermeture d'Excel en croyant à un plantage, alors qu'il ne s'est rien passé d'autre qu'un interrupteur laissé désactivé.

Vous lirez qu'Excel remet ScreenUpdating à True automatiquement à la fin d'une macro. Parfois, c'est le cas — mais on ne peut pas concevoir un programme autour de « parfois ». Quand la macro plante au lieu de se terminer proprement, ou quand vous avancez pas à pas en mode arrêt, l'écran reste bloqué. La recommandation de Microsoft elle-même est de le remettre à True vous-même. La règle est donc simple : rétablissez-le dans un gestionnaire d'erreurs, pour qu'il s'exécute que la macro réussisse ou explose.

Sub SafeRepaint()
    Application.ScreenUpdating = False
    On Error GoTo CleanExit
    ' ... du travail susceptible de lever une erreur ...
    Cells(1, 1).Value = 1 / 0        ' boum
CleanExit:
    Application.ScreenUpdating = True ' ceci s'execute meme apres l'erreur ci-dessus
    If Err.Number <> 0 Then MsgBox Err.Description
End Sub

Le motif On Error GoTo CleanExit / étiquette relève de la même discipline que partage tout le cluster — voir VBA On Error. Sans lui, une seule erreur non gérée transforme une optimisation de vitesse en ticket de support.

Le piège du scintillement dû au rétablissement imbriqué

Un bug plus subtil : vous avez désactivé ScreenUpdating, mais l'écran scintille encore. La cause habituelle est un Sub appelé qui le remet à True.

Sub Outer()
    Application.ScreenUpdating = False
    FormatBlock              ' ce sub le reactive - les redessins reprennent ici
    WriteTotals              ' scintille, car la mise a jour est de nouveau active
    Application.ScreenUpdating = True
End Sub

Sub FormatBlock()
    Application.ScreenUpdating = False
    ' ... mise en forme ...
    Application.ScreenUpdating = True   ' <-- le coupable : le reactive aussi pour l'appelant
End Sub

ScreenUpdating est un réglage global unique, pas une pile. Quand FormatBlock le remet à True, il est True pour Outer aussi, et chaque écriture après l'appel repeint. Le correctif consiste à laisser la macro de premier niveau être seule maîtresse de l'interrupteur et à ce que les Sub auxiliaires n'y touchent pas — ou à ce que chaque auxiliaire sauvegarde et rétablisse la valeur qu'il a trouvée au lieu de coder True en dur. C'est la même habitude « sauvegarder l'état trouvé, rétablir l'état trouvé » qui préserve aussi Calculation.

ScreenUpdating face aux autres interrupteurs cosmétiques

ScreenUpdating a des cousins plus discrets. Application.DisplayStatusBar = False et Application.Calculation = xlCalculationManual sont souvent posés ensemble pour la vitesse, et Application.EnableEvents = False pour la justesse. Mais soyez au clair sur le rôle de chacun : ScreenUpdating est purement cosmétique et sans gravité si on l'oublie — le pire cas est une fenêtre d'apparence figée qu'un redémarrage corrige. Calculation laissé désactivé laisse des nombres faux en silence, et EnableEvents laissé désactivé laisse les événements du classeur morts. Ils se ressemblent dans le code — trois lignes = False en tête — mais le coût de l'oubli de chacun est radicalement différent. Traitez les trois comme « à rétablir impérativement », et sachez pourquoi les enjeux diffèrent.

Comment ExcelMaster aide

ScreenUpdating tient en une ligne, mais bien l'utiliser suppose de savoir quand il aide (boucles limitées par l'écran), quand il est gâché (travail limité par le calcul ou les entrées-sorties), et de toujours le rétablir dans un gestionnaire d'erreurs pour qu'un plantage ne bloque pas l'affichage. Cela fait étonnamment de jugement pour une seule propriété.

ExcelMaster écrit la version rapide par défaut. Demandez-lui de « colorer une ligne sur deux sur 5 000 lignes », et il regroupe le travail, enveloppe ScreenUpdating (ainsi que Calculation, et EnableEvents quand des événements sont en jeu) dans un rétablissement CleanExit, et saute complètement l'interrupteur quand la macro n'est pas limitée par l'écran. Vous obtenez le gain de vitesse et la sécurité sans mémoriser quel levier corrige quel type de lenteur.

Questions fréquentes

Que fait Application.ScreenUpdating = False en VBA ?

Cela dit à Excel de cesser de repeindre l'écran pendant l'exécution de votre macro. Excel continue de mettre à jour le classeur en mémoire mais ne dessine pas les changements, ce qui supprime le scintillement visible et le coût par redessin. Quand vous remettez ScreenUpdating = True, Excel repeint une seule fois et le résultat final apparaît d'un seul coup.

Pourquoi ma macro reste-t-elle lente après avoir mis ScreenUpdating = False ?

Parce que ScreenUpdating ne supprime que le travail de redessin de l'écran. Si la macro est lente à cause d'un recalcul, d'entrées-sorties de fichier ou de base de données, ou du surcoût d'une boucle par cellule, désactiver les redessins ne change rien. Mettez Application.Calculation = xlCalculationManual pour les macros lourdes en calcul, et remplacez les boucles cellule par cellule par une seule lecture et écriture de tableau pour le plus grand gain.

Dois-je remettre ScreenUpdating à True ?

Oui — remettez-le explicitement. Excel le rétablit parfois quand une macro se termine proprement, mais pas quand la macro lève une erreur non gérée ni quand vous vous arrêtez en mode arrêt, ce qui peut laisser l'écran figé ou grisé. Rétablissez-le dans un gestionnaire d'erreurs (On Error GoTo CleanExit avec Application.ScreenUpdating = True dans l'étiquette) pour qu'il s'exécute que la macro réussisse ou échoue.

Pourquoi l'écran scintille-t-il encore alors que j'ai désactivé ScreenUpdating ?

En général parce qu'un Sub appelé remet ScreenUpdating = True avant de rendre la main. C'est un réglage global unique, donc un auxiliaire qui le réactive le fait aussi pour l'appelant, et chaque écriture après l'appel repeint. Laissez la macro de premier niveau être seule maîtresse de l'interrupteur, et faites en sorte que les Sub auxiliaires n'y touchent pas ou sauvegardent et rétablissent la valeur qu'ils ont trouvée.

Quelle est la différence entre ScreenUpdating, Calculation et EnableEvents ?

Les trois sont des interrupteurs Application que vous désactivez pour rendre une macro plus rapide ou plus sûre, mais ils contrôlent des choses différentes. ScreenUpdating arrête les redessins de l'écran (cosmétique, sans gravité si on l'oublie). Calculation arrête le recalcul des formules (le laisser désactivé affiche des nombres périmés). EnableEvents arrête le déclenchement des gestionnaires d'événements (le laisser désactivé casse les événements du classeur jusqu'au redémarrage d'Excel).

Testé dans

Testé dans : Excel 365 (Windows 11), VBA 7.1 — dernière vérification le 17/08/2026.

Guides associés : VBA Calculation · VBA EnableEvents · VBA On Error · VBA Worksheet_Change · VBA Range