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

VBA ScreenUpdating en Excel — detén el parpadeo y acelera tus macros (y por qué no arreglará una lenta)

|

VBA ScreenUpdating en Excel — detén el parpadeo y acelera tus macros (y por qué no arreglará una lenta)

TL;DRApplication.ScreenUpdating = False le dice a Excel que deje de repintar la pantalla mientras corre tu macro y la redibuje una sola vez al final. Eso mata el parpadeo y da una mejora de velocidad modesta — pero solo cuando tu código escribe en celdas, selecciona o se desplaza. No hace nada por una macro que va lenta por el recálculo o por la E/S de archivos. Vuelve a ponerlo en True cuando termines, y nunca confíes en que se reinicie solo — un fallo puede dejar la pantalla congelada y gris:

Sub PaintRows()
    Application.ScreenUpdating = False        ' deja de repintar - se acaba el parpadeo
    On Error GoTo CleanExit                    ' para que un fallo no deje la pantalla colgada
    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         ' restaura siempre, incluso tras un error
End Sub

Cada vez que tu macro cambia una celda, Excel quiere redibujar la pantalla para mostrarlo. Haz eso 5.000 veces y estás pagando por 5.000 repintados que el usuario nunca necesitó ver. ScreenUpdating = False los agrupa en un solo repintado al final. Esta guía se construye sobre una sola idea — ScreenUpdating es un interruptor de repintado, no un interruptor mágico de velocidad. Elimina el trabajo de redibujado, y solo el de redibujado. Entiende eso y sabrás exactamente cuándo ayuda, cuándo es malgastar una línea, y por qué dejarlo apagado tras un fallo es el verdadero peligro.

Lo que aprenderás

  • El modelo mental — Excel repinta tras cada cambio; este interruptor agrupa los redibujados en uno solo
  • Dónde ayuda de verdad — escribir, seleccionar, desplazarse — y dónde no hace nada
  • La regla más importante — un fallo puede dejar la pantalla colgada, así que restáuralo en un manejador de errores
  • La trampa de parpadeo del restaurado anidado — por qué la pantalla sigue parpadeando después de apagarlo
  • Cómo se empareja con Calculation y EnableEvents
  • ScreenUpdating frente a DisplayStatusBar y los demás interruptores cosméticos

El modelo mental: Excel repinta tras cada cambio

Por defecto, Excel mantiene la pantalla sincronizada con el libro en tiempo real. Tu macro asigna A1 y Excel repinta; asigna A2 y Excel repinta otra vez. Cada repintado es barato por sí solo, pero en un bucle que toca miles de celdas los repintados dominan — y ves la pantalla dar tumbos mientras la macro garabatea hoja abajo.

Application.ScreenUpdating = False suspende eso. Excel sigue actualizando el libro en memoria pero deja de dibujarlo. Cuando vuelves a poner la propiedad en True (o la macro termina), Excel repinta una vez, y el resultado terminado aparece de un único salto limpio. El usuario ve el antes y el después, nunca el parpadeo intermedio.

Application.ScreenUpdating = False   ' Excel deja de dibujar (sigue trabajando)
' ... miles de escrituras de celda ocurren de forma invisible ...
Application.ScreenUpdating = True    ' un solo repintado muestra el estado final

Dónde ayuda de verdad — y dónde no hace nada

Esta es la parte que la mayoría de los tutoriales se saltan, y es justo de lo que va todo. ScreenUpdating elimina el trabajo de redibujado. Si tu macro va lenta por otra razón, apagarlo no cambia nada.

Ayuda mucho cuando tu código:

  • escribe en muchas celdas dentro de un bucle,
  • usa .Select / .Activate (cada selección es un repintado),
  • se desplaza, o cambia lo que se ve en pantalla.

No hace nada cuando tu macro va lenta por:

  • un recálculo pesado tras cada escritura — de eso se encarga Calculation,
  • leer o escribir archivos, consultar una base de datos o llamar a un servicio web,
  • trabajo puramente en memoria sobre arrays y variables (no hay nada que repintar).

Así que si añadiste ScreenUpdating = False y la macro sigue lenta, echaste mano del interruptor equivocado. La mayor mejora de velocidad del mundo real no suele ser esta en absoluto — es sustituir un bucle celda a celda por una sola lectura y una sola escritura de array, que elimina los repintados y el coste por celda de un solo golpe. ScreenUpdating es el toque final sobre eso, no el arreglo por sí mismo.

La regla más importante: un fallo puede dejar la pantalla colgada

Aquí está el fallo con el que todo el mundo se topa. Pones ScreenUpdating = False, tu macro falla a mitad de camino y la ejecución se detiene — antes de la línea que lo vuelve a activar. Excel se queda ahora con la actualización de pantalla desactivada. La ventana parece congelada, dibujada a medias o directamente gris; quedan imágenes fantasma de cuadros de diálogo. Los usuarios fuerzan el cierre de Excel creyendo que se colgó, cuando lo único que pasó es que un interruptor se quedó apagado.

Leerás que Excel restablece ScreenUpdating a True automáticamente cuando una macro termina. A veces lo hace — pero no puedes diseñar tu código apoyándote en un «a veces». Cuando la macro falla en lugar de terminar limpiamente, o cuando avanzas paso a paso en modo interrupción, la pantalla se queda atascada. La propia recomendación de Microsoft es que lo pongas de nuevo en True tú mismo. Así que la regla es sencilla: restáuralo en un manejador de errores, para que se ejecute tanto si la macro tiene éxito como si revienta.

Sub SafeRepaint()
    Application.ScreenUpdating = False
    On Error GoTo CleanExit
    ' ... trabajo que podria lanzar un error ...
    Cells(1, 1).Value = 1 / 0        ' boom
CleanExit:
    Application.ScreenUpdating = True ' esto se ejecuta incluso tras el error de arriba
    If Err.Number <> 0 Then MsgBox Err.Description
End Sub

El patrón On Error GoTo CleanExit / etiqueta es la misma disciplina que comparte todo el clúster — ve VBA On Error. Sin él, un solo error no controlado convierte una optimización de velocidad en un ticket de soporte.

La trampa de parpadeo del restaurado anidado

Un bug más sutil: apagaste ScreenUpdating, pero la pantalla sigue parpadeando. La causa habitual es un sub llamado que lo vuelve a poner en True.

Sub Outer()
    Application.ScreenUpdating = False
    FormatBlock              ' este sub lo vuelve a activar - el repintado se reanuda aqui
    WriteTotals              ' parpadea, porque la actualizacion esta activa otra vez
    Application.ScreenUpdating = True
End Sub

Sub FormatBlock()
    Application.ScreenUpdating = False
    ' ... formateo ...
    Application.ScreenUpdating = True   ' <-- el culpable - lo reactiva tambien para quien lo llama
End Sub

ScreenUpdating es un único ajuste global, no una pila. Cuando FormatBlock lo vuelve a poner en True, queda en True también para Outer, y cada escritura posterior a la llamada repinta. El arreglo es dejar que la macro de nivel superior sea la dueña del interruptor y que los subs auxiliares no lo toquen — o que cada auxiliar guarde y restaure el valor que se encontró en vez de fijar True a lo bruto. Ese mismo hábito de «guarda lo que había, restaura lo que había» es lo que mantiene a salvo también a Calculation.

ScreenUpdating frente a los demás interruptores cosméticos

ScreenUpdating tiene primos más discretos. Application.DisplayStatusBar = False y Application.Calculation = xlCalculationManual se ponen a menudo juntos por velocidad, y Application.EnableEvents = False por corrección. Pero ten claro qué hace cada uno: ScreenUpdating es puramente cosmético y barato de olvidar — en el peor caso tienes una ventana con pinta de congelada que un reinicio arregla. Dejar Calculation apagado deja números mal en silencio, y dejar EnableEvents apagado deja muertos los eventos del libro. En el código se parecen — tres líneas = False al principio — pero el coste de olvidar cada uno es radicalmente distinto. Trata los tres como «hay que restaurar», y ten claro por qué el riesgo es diferente.

Cómo ayuda ExcelMaster

ScreenUpdating es una sola línea, pero usarlo bien significa saber cuándo ayuda (bucles limitados por la pantalla), cuándo se desperdicia (trabajo limitado por el cálculo o por la E/S), y restaurarlo siempre en un manejador de errores para que un fallo no deje la pantalla colgada. Es una cantidad sorprendente de criterio para una sola propiedad.

ExcelMaster escribe la versión rápida por defecto. Pídele «colorea una fila sí y otra no a lo largo de 5.000 filas» y agrupa el trabajo, envuelve ScreenUpdating (y Calculation, y EnableEvents cuando hay eventos en juego) en un restaurado CleanExit, y se salta el interruptor por completo cuando la macro no está limitada por la pantalla. Te llevas la mejora de velocidad y la seguridad sin memorizar qué palanca arregla qué tipo de lentitud.

Preguntas frecuentes

¿Qué hace Application.ScreenUpdating = False en VBA?

Le dice a Excel que deje de repintar la pantalla mientras corre tu macro. Excel sigue actualizando el libro en memoria pero no dibuja los cambios, lo que elimina el parpadeo visible y el coste de cada repintado. Cuando vuelves a poner ScreenUpdating = True, Excel repinta una vez y el resultado final aparece de un solo salto.

¿Por qué mi macro sigue lenta tras poner ScreenUpdating = False?

Porque ScreenUpdating solo elimina el trabajo de redibujado de pantalla. Si la macro va lenta por el recálculo, por la E/S de archivos o de base de datos, o por el coste de un bucle celda a celda, desactivar los repintados no cambia nada. Pon Application.Calculation = xlCalculationManual para las macros con mucho cálculo, y sustituye los bucles celda a celda por una sola lectura y escritura de array para la mayor ganancia.

¿Tengo que volver a poner ScreenUpdating en True?

Sí — vuelve a ponerlo de forma explícita. Excel a veces lo restaura cuando una macro termina limpiamente, pero no cuando la macro lanza un error no controlado o te detienes en modo interrupción, lo que puede dejar la pantalla congelada o gris. Restáuralo en un manejador de errores (On Error GoTo CleanExit con Application.ScreenUpdating = True en la etiqueta) para que se ejecute tanto si la macro tiene éxito como si falla.

¿Por qué la pantalla sigue parpadeando aunque apagué ScreenUpdating?

Normalmente porque un sub llamado pone ScreenUpdating = True antes de volver. Es un único ajuste global, así que un auxiliar que lo reactiva lo hace también para quien lo llamó, y cada escritura posterior a la llamada repinta. Deja que la macro de nivel superior sea la dueña del interruptor, y que los subs auxiliares no lo toquen o guarden y restauren el valor que se encontraron.

¿Cuál es la diferencia entre ScreenUpdating, Calculation y EnableEvents?

Los tres son interruptores de Application que apagas para hacer una macro más rápida o más segura, pero controlan cosas distintas. ScreenUpdating detiene los repintados de pantalla (cosmético, barato de olvidar). Calculation detiene el recálculo de fórmulas (dejarlo apagado muestra números obsoletos). EnableEvents detiene el disparo de los manejadores de eventos (dejarlo apagado rompe los eventos del libro hasta que Excel se reinicia).

Probado en

Probado en: Excel 365 (Windows 11), VBA 7.1 — última verificación el 17/08/2026.

Guías relacionadas: VBA Calculation · VBA EnableEvents · VBA On Error · VBA Worksheet_Change · VBA Range