TL;DR —
Application.Waitpausa tu macro hasta un momento del reloj de pared, no durante un número de segundos. Por esoApplication.Wait 5no hace casi nada —5es 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.Waites 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.Waites 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, porqueApplication.Waitno puede bajar de un segundo. - Una pausa en la que Excel debe seguir receptivo (progreso, cancelar, una cuenta atrás visible) — un
bucle
DoEvents, porqueApplication.Waitcongela 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
