TL;DR —
Application.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 aScreenUpdating = 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 conApplication.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é
= Falsegana 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
