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

VBA Wait en Excel — Application.Wait, por qué congela Excel y cuándo usar Sleep en su lugar

|

VBA Wait en Excel — Application.Wait, por qué congela Excel y cuándo usar Sleep en su lugar

TL;DRApplication.Wait pausa tu macro hasta un momento del reloj de pared, no durante un número de segundos. Por eso Application.Wait 5 no hace casi nada — 5 es un número de serie de hora del día que ya está en el pasado. Lo que quieres es «ahora más cinco segundos», y su resolución es solo de segundos enteros:

Sub PauseFiveSeconds()
    ' despierta a la hora actual MAS cinco segundos
    Application.Wait Now + TimeValue("0:00:05")
    MsgBox "Five seconds later."
End Sub

Application.Wait es la herramienta a la que la gente echa mano primero cuando quiere que una macro «se pause», y es la primera que usa mal, porque su nombre esconde cómo funciona. No es un temporizador de cocina que pones a una duración — es un despertador que pones a un momento. Esta guía se construye sobre una sola idea, porque el modelo del despertador explica cada rareza: el argumento, el suelo de segundos enteros, y el hecho de que mientras la alarma está puesta, Excel se queda congelado por completo y no puede hacer nada más.

Lo que aprenderás

  • El modelo mental — Application.Wait es un despertador (un momento), no un cronómetro (una duración)
  • La única regla con la que todos tropiezan — el argumento es un tiempo absoluto, no una duración
  • Por qué solo distingue segundos enteros, y qué usar para pausas por debajo del segundo
  • Por qué congela Excel — sin repintado, sin clics, sin actualizaciones de la barra de estado — mientras espera
  • El veredicto honesto sobre cuándo Application.Wait es lo correcto, y cuándo Sleep o un bucle DoEvents es la herramienta que de verdad querías

El modelo mental: un despertador, no un cronómetro

A un despertador no le dices «suena dentro de ocho horas». Le dices «suena a las 7:00». Application.Wait funciona exactamente igual: le das un punto en el tiempo al que despertar, y se bloquea hasta que el reloj del sistema llega a ese punto. No descuenta una duración.

Ese único hecho es el origen del bug número uno. Como el argumento es un momento, no puedes escribir el número de segundos que quieres — tienes que escribir ahora, más los segundos que quieres, y construyes «los segundos que quieres» con TimeValue:

Application.Wait Now + TimeValue("0:00:05")   ' despierta en ahora + 5 segundos  -> espera ~5s
Application.Wait Now + TimeValue("0:01:30")   ' despierta en ahora + 1 min 30s
Application.Wait "14:30:00"                    ' despierta a las 2:30 PM de hoy (un momento literal)

Now es la fecha y hora actuales; TimeValue("0:00:05") es la duración de cinco segundos expresada como un valor de tiempo; sumarlos da el momento de dentro de cinco segundos. Eso es lo que Application.Wait necesita.

La regla con la que todos tropiezan: el argumento es un tiempo absoluto

Aquí está el fallo que manda a la gente a los buscadores. Leen «Wait pausa la macro» y escriben:

Application.Wait 5      ' MAL - NO espera 5 segundos

Para VBA, 5 no es «cinco segundos». Es el número de serie 5, que es una fecha/hora: cinco días después de la época de 1900, a medianoche — un momento que queda décadas en el pasado. Application.Wait mira el reloj, ve que ese momento pasó hace mucho, y vuelve prácticamente de inmediato. La macro no da error; simplemente no espera. Ese silencioso «ni se pausó ni se quejó» es justo lo que lo hace tan confuso.

La misma trampa en una forma más sutil: Application.Wait Now + 5 espera cinco días, porque 5 sumado a una fecha significa cinco días, no cinco segundos. Envuelve siempre la duración en TimeValue (o TimeSerial):

Application.Wait Now + 5                      ' espera 5 DIAS - casi nunca es lo que querias
Application.Wait Now + TimeValue("0:00:05")   ' espera 5 segundos - correcto
Application.Wait Now + TimeSerial(0, 0, 5)    ' lo mismo, construido a partir de numeros

Si te quedas con una sola línea de esta página, que sea Now + TimeValue(...).

Solo segundos enteros — para algo más fino, usa Sleep

TimeValue no puede expresar fracciones de segundo. La pausa más fina que Application.Wait puede tomar es un segundo; no existe TimeValue("0:00:00.25"). Si pides una pausa de un cuarto de segundo — para moderar un bucle de sondeo, para espaciar peticiones, para empujar una animación — Application.Wait no puede hacerlo.

Esa es la línea divisoria limpia entre las dos herramientas de espera. Segundos enteros, sin necesidad de Declare: Application.Wait. Por debajo del segundo, precisión de milisegundos: la API de Windows Sleep. Si te descubres deseando que Application.Wait aceptara milisegundos, ya se te ha quedado pequeña — cámbiate a Sleep.

La parte que todos olvidan: congela Excel por completo

Mientras Application.Wait está bloqueando, Excel no hace nada más. Corre en el único hilo de Excel, y no libera ese hilo para procesar mensajes. Así que durante la espera:

  • la pantalla no se repinta,
  • un mensaje de barra de estado que acabas de poner no aparece,
  • los clics y las pulsaciones de teclas se amontonan sin atender,
  • y si la espera es lo bastante larga, Windows le estampa «No responde» a la ventana.

Esta es la trampa que convierte a Application.Wait en la herramienta equivocada para la razón más común por la que la gente la usa. Si tu objetivo es «mostrar una cuenta atrás», «dejar que el usuario vea el progreso» o «dejar que pulse Cancelar», Application.Wait te sabotea activamente — congela justo la interfaz que intentabas mantener viva.

Una pausa receptiva es una construcción completamente distinta: un bucle corto que cede con DoEvents para que Excel siga respirando mientras pasa el tiempo.

' Una pausa que mantiene Excel vivo y cancelable - NO es Application.Wait
Dim finishAt As Double
finishAt = Timer + 5                 ' Timer = segundos desde medianoche
Do While Timer < finishAt
    DoEvents                          ' deja que Excel repinte y maneje los clics
    If gCancel Then Exit Do
Loop

Fíjate en lo que usa eso: Timer para medir los segundos transcurridos y DoEvents para mantener viva la ventana. Application.Wait no te da ninguno de los dos.

El veredicto honesto: cuándo Application.Wait es de verdad lo correcto

Application.Wait se gana su sitio en exactamente una situación: necesitas una pausa de un número entero de segundos, y de verdad te da igual que Excel esté congelado durante ella. El caso de manual es darle un momento a una fuente externa para que se ponga al día — acabas de lanzar una petición DDE/RTD, una consulta web o una actualización de QueryTable, y quieres esperar un par de segundos a que lleguen los datos antes de leer el resultado. Es simple, no necesita ninguna declaración de API, y libera la CPU (no gira en vacío), así que una pausa corta, no interactiva y de segundos enteros es un buen uso.

Para todo lo demás, nombra lo que de verdad quieres:

  • Pausa por debajo del segundo (moderar un bucle, espaciar llamadas) — Sleep, porque Application.Wait no puede bajar de un segundo.
  • Una pausa en la que Excel debe seguir receptivo (progreso, cancelar, una cuenta atrás visible) — un bucle DoEvents, porque Application.Wait congela la ventana.
  • Ejecutar algo más tarde según un horario (cada 5 minutos, a las 9 de la mañana) — Application.OnTime, que no es una espera en absoluto.

Un Excel congelado es el comportamiento correcto de Application.Wait, no un bug. El bug es usarlo cuando un Excel congelado no era lo que querías.

Cómo ayuda ExcelMaster

Elegir entre Application.Wait, Sleep, un bucle DoEvents y OnTime es una decisión de criterio que depende de si necesitas temporización por debajo del segundo, de si Excel debe seguir receptivo, y de si el retardo es puntual o es un horario. Fállala y o bien congelas Excel cuando querías mantenerlo vivo, o bien escribes Application.Wait 5 y te preguntas por qué no se pausa nada.

ExcelMaster toma esa decisión por ti. Describe lo que quieres — «pausa un par de segundos a que se refresque la consulta», o «espera, pero déjame cancelar» — y elige la construcción correcta: Application.Wait Now + TimeValue(...) para una pausa simple de segundos enteros, una declaración de Sleep para moderación por debajo del segundo, o un bucle DoEvents protegido cuando la ventana tiene que seguir receptiva. Sin errores de un número de serie, sin una macro congelada donde querías una viva.

Preguntas frecuentes

¿Cómo hago que una macro espere 5 segundos en VBA?

Usa Application.Wait Now + TimeValue("0:00:05"). El argumento de Application.Wait es un momento al que despertar, no una duración, así que sumas el TimeValue de cinco segundos a Now (la hora actual). Escribir Application.Wait 5 no funciona — VBA lee 5 como un número de serie de fecha/hora en el pasado, así que la macro no se pausa en absoluto.

¿Por qué Application.Wait 5 no pausa mi macro?

Porque 5 se interpreta como un número de serie de hora del día (aproximadamente medianoche del quinto día de 1900), que ya está en el pasado. Application.Wait se bloquea hasta que el reloj alcanza el momento que le diste, y ese momento pasó hace mucho, así que vuelve de inmediato. Tienes que pasar un momento futuro, como Now + TimeValue("0:00:05").

¿Puede Application.Wait pausar menos de un segundo?

No. Application.Wait solo distingue segundos enteros, porque TimeValue no puede expresar fracciones de segundo. Para una pausa por debajo del segundo — 250 milisegundos, por ejemplo — usa en su lugar la API Sleep de Windows (Sleep 250), que toma milisegundos.

¿Por qué Excel se congela o dice «No responde» durante Application.Wait?

Porque Application.Wait bloquea el único hilo de Excel y no le deja procesar mensajes mientras espera, así que la pantalla no puede repintarse y los clics no se atienden. Para una pausa en la que Excel debe seguir vivo — para mostrar progreso o permitir Cancelar — usa un bucle corto que llame a DoEvents en vez de Application.Wait.

¿Cuál es la diferencia entre Application.Wait y Sleep?

Application.Wait viene integrado en Excel, no necesita declaración, espera hasta un momento del reloj y distingue segundos enteros. Sleep es una llamada a la API de Windows que debes declarar, espera un número de milisegundos (precisión por debajo del segundo) y necesita el atributo PtrSafe en Excel de 64 bits. Usa Application.Wait para pausas simples de segundos enteros y Sleep cuando necesites una temporización más fina. Ambos congelan Excel mientras esperan.

Probado en

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

Guías relacionadas: VBA Sleep · VBA Timer · VBA DoEvents · VBA StatusBar · VBA ScreenUpdating