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

VBA StatusBar en Excel — muestra el progreso de la macro sin un UserForm (y el mensaje que se queda pegado para siempre)

|

VBA StatusBar en Excel — muestra el progreso de la macro sin un UserForm (y el mensaje que se queda pegado para siempre)

TL;DRApplication.StatusBar = "..." escribe tu propio texto en la barra de la parte inferior izquierda de la ventana de Excel. Es el indicador de progreso más ligero posible — una línea, sin UserForm, sin parpadeo, y sobrevive a ScreenUpdating = False. La pega es restablecerla: lo que escribiste se queda pegado ahí después de que la macro termina hasta que le devuelves la barra a Excel con Application.StatusBar = False (no una cadena vacía). Restáurala en un manejador de errores para que un fallo no deje un mensaje obsoleto clavado en la ventana:

Sub LongJob()
    Application.ScreenUpdating = False
    On Error GoTo CleanExit
    Dim i As Long, n As Long
    n = 10000
    For i = 1 To n
        ' ... trabaja sobre la fila 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        ' devuelve la barra a Excel - NO la dejes como ""
    Application.ScreenUpdating = True
End Sub

Cuando una macro corre más de un segundo o dos, la primera pregunta del usuario es «¿esto sigue vivo?». La barra de estado la responde por el precio de una línea. Esta guía se construye sobre una sola idea — la barra de estado es prestada: escribes en ella, y tienes que devolverla. Excel no la reclamará por su cuenta, así que toda la diferencia entre un indicador de progreso profesional y una ventana con un «Processing 73%...» congelado incrustado es una única línea de restablecimiento.

Lo que aprenderás

  • El modelo mental — la barra de estado es de Excel, tú la tomas prestada y debes devolverla
  • El patrón de escribir y restablecer, y por qué = False gana a = ""
  • El modismo del porcentaje de progreso que responde «¿cuánto queda?»
  • Por qué el texto no se actualiza en un bucle apretado — y dónde encaja DoEvents
  • Cuándo la línea única basta y cuándo una barra de progreso de UserForm de verdad se gana su sitio
  • Cómo se empareja con ScreenUpdating y el restaurado CleanExit

El modelo mental: la barra es de Excel

Por defecto, la franja de la parte inferior izquierda de la ventana es de Excel para que la gestione. Muestra «Listo», o «Calculando», o la suma de las celdas que tienes seleccionadas. Cuando asignas una cadena a Application.StatusBar, tomas ese espacio — Excel deja de publicar sus propios mensajes ahí y muestra el tuyo en su lugar. Desde ese momento, la barra es tuya hasta que la devuelvas.

Devolverla es una línea: Application.StatusBar = False. Eso no solo borra el texto — devuelve el control a Excel, así que la barra vuelve a mostrar «Listo» y compañía. Este es el único hecho con el que todo el mundo tropieza, así que vale la pena decirlo con claridad:

Application.StatusBar = "Working..."   ' ahora eres el dueno de la barra
Application.StatusBar = False          ' la devuelves; Excel la gestiona otra vez

Por qué False, no una cadena vacía

El instinto cuando terminas es borrar el mensaje: Application.StatusBar = "". Parece limpio, y está mal. Una cadena vacía sigue siendo tu mensaje — uno en blanco. Excel te sigue cediendo la barra, así que se queda vacía y nunca vuelve a mostrar «Listo» ni la suma de la selección. Es el mismo bug que dejar texto obsoleto, solo que más difícil de notar porque el síntoma es una barra de estado sospechosamente silenciosa en vez de un mensaje congelado visible.

Application.StatusBar = False es la única asignación que dice «he terminado, recupérala». Hazlo un reflejo: la línea que enciende la barra de estado tiene un = False a juego en el manejador CleanExit, exactamente igual que ScreenUpdating = True.

El modismo del porcentaje de progreso

La razón por la que la gente busca una «barra de progreso de VBA» es casi siempre esta: un bucle que corre lo bastante como para que el usuario necesite verlo moverse. La barra de estado lo hace sin interfaz extra:

Dim i As Long, n As Long
n = UBound(data)
For i = 1 To n
    ' ... trabajo ...
    If i Mod 100 = 0 Then
        Application.StatusBar = "Row " & i & " of " & n & " - " & Format(i / n, "0%")
    End If
Next i

Dos detalles hacen que se sienta bien. Primero, actualiza en un intervalo (i Mod 100 = 0), no en cada iteración — escribir en la barra de estado 10.000 veces es lento de por sí y el usuario no puede leer números pasando volando tan rápido. Segundo, muestra el progreso sobre un total (i de n, un porcentaje), no solo un giro sin fin, para que el usuario pueda estimar cuánto queda. Esa es la diferencia entre «algo está pasando» y «vas por dos tercios».

Por qué el texto no se actualiza — y dónde encaja DoEvents

Aquí está la trampa que manda a la gente a los foros: pones Application.StatusBar en un bucle y el texto nunca cambia en pantalla — muestra el primer valor y se congela, aunque tu código claramente lo esté reasignando. La barra de estado, como todo lo demás, solo se repinta cuando Excel tiene un momento para procesar su cola de mensajes. Un bucle apretado de VBA nunca cede ese momento, así que el repintado nunca ocurre.

El arreglo es DoEvents — le devuelve el control a Excel brevemente para que la barra se redibuje de verdad:

If i Mod 100 = 0 Then
    Application.StatusBar = "Row " & i & " of " & n
    DoEvents                      ' deja que Excel repinte la barra
End If

Úsalo en el mismo intervalo que la actualización, no en cada iteración — DoEvents tiene sus propios costes y riesgos de reentrada. Y fíjate en que este es el único sitio donde la barra de estado se comporta mejor que un UserForm bajo ScreenUpdating = False: la barra de estado se actualiza bien con la actualización de pantalla apagada, mientras que una barra de progreso de UserForm necesita un .Repaint explícito.

Cuándo la línea única basta — y cuándo no

Para la gran mayoría de las macros, Application.StatusBar es el indicador de progreso correcto, y echar mano de un UserForm es sobreingeniería. Es una línea, no roba el foco, no parpadea, y convive con ScreenUpdating = False. Prefiérela por defecto.

Una barra de progreso de UserForm se gana su código extra solo cuando necesitas específicamente algo que la barra de estado no puede dar: una barra gráfica que se llena, un botón de cancelar, un desglose de varias líneas, o marca en un cuadro de diálogo que el usuario no pueda pasar por alto. A veces son necesidades reales — pero son la excepción, y vienen con dolores de cabeza de foco, repintado y modalidad que la barra de estado esquiva por completo. Ten en cuenta también que Application.DisplayStatusBar debe estar en True para que la barra sea visible siquiera; si una macro o un ajuste anterior la ocultó, tu texto se escribirá pero no se mostrará.

Cómo ayuda ExcelMaster

Un buen indicador de progreso es una línea para escribir y una línea para restablecer, más el criterio de actualizar en un intervalo, añadir DoEvents solo donde la barra necesita repintarse, y restaurar con = False en un manejador de errores para que un fallo no clave un mensaje obsoleto en la ventana. Olvida el restablecimiento y despachas un libro que dice «Processing 47%...» para siempre.

ExcelMaster te lo monta. Pídele «muestra el progreso mientras esto corre a lo largo de 50.000 filas» y escribe el porcentaje en la barra de estado en un intervalo sensato, lo empareja con DoEvents para que de verdad se mueva, y restablece la barra con Application.StatusBar = False en el mismo restaurado CleanExit que ScreenUpdating — así te llevas un indicador de progreso que se porta bien y limpia lo suyo.

Preguntas frecuentes

¿Cómo muestro una barra de progreso en Excel VBA?

La forma más ligera es Application.StatusBar = "...", que escribe tu texto en la barra de la parte inferior izquierda de la ventana — sin necesidad de UserForm. Actualízala en un intervalo dentro de tu bucle (por ejemplo If i Mod 100 = 0 Then), muestra el progreso como «fila i de n» o un porcentaje, y restablécela con Application.StatusBar = False cuando termines. Una barra de progreso gráfica de UserForm solo vale el código extra cuando necesitas una barra que se llena o un botón de cancelar.

¿Cómo restablezco Application.StatusBar en VBA?

Pon Application.StatusBar = False. Eso devuelve el control de la barra a Excel para que muestre «Listo» y sus propios mensajes otra vez. No uses Application.StatusBar = "" — una cadena vacía sigue siendo tu mensaje, así que Excel te sigue cediendo la barra y se queda en blanco en vez de reanudar su comportamiento normal.

¿Por qué el texto de mi barra de estado no se actualiza mientras corre la macro?

Porque un bucle apretado de VBA nunca deja que Excel procese su cola de mensajes, así que la barra nunca se repinta. Añade DoEvents justo después de poner el texto (en el mismo intervalo que la actualización) para darle a Excel un momento de redibujarla. A diferencia de una barra de progreso de UserForm, la barra de estado sí se actualiza correctamente con ScreenUpdating = False.

¿Funciona la barra de estado con ScreenUpdating apagado?

Sí. Application.StatusBar se actualiza incluso cuando Application.ScreenUpdating = False, lo que es una razón por la que es mejor opción por defecto que una barra de progreso de UserForm para las macros largas. Puede que aún necesites DoEvents para que el texto se repinte dentro de un bucle apretado. Asegúrate también de que Application.DisplayStatusBar esté en True, o la barra está oculta y tu texto no se mostrará.

StatusBar frente a una barra de progreso de UserForm — ¿cuál debería usar?

Usa Application.StatusBar para casi todo: es una línea, sin parpadeo, sin robar el foco, y sobrevive a ScreenUpdating = False. Construye una barra de progreso de UserForm solo cuando necesites específicamente una barra gráfica que se llena, un botón de cancelar, o un estado de varias líneas que la barra de una sola línea no puede mostrar.

Probado en

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

Guías relacionadas: VBA DoEvents · VBA DisplayAlerts · VBA ScreenUpdating · VBA On Error · VBA MsgBox