TL;DR — La función
Timerno pausa nada y no ejecuta nada según un horario. Devuelve el número de segundos transcurridos desde medianoche como un decimal, y lo lees antes y después de un bloque de código para medir cuánto tardó ese código:
Sub HowLongDoesItTake()
Dim t As Double
t = Timer ' arranca el cronometro
' ... el codigo que quieres medir ...
Range("A1:A100000").Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlNo
Debug.Print "Took " & Format(Timer - t, "0.00") & " seconds"
End Sub
Timer es la función peor bautizada de VBA. Su nombre promete una cuenta atrás o un programador de
tareas, así que la gente busca «vba timer» queriendo «ejecuta esto cada cinco minutos» o «espera y luego
dispara» — y Timer no hace ninguna de las dos. Es un cronómetro: una forma de responder «¿cuánto
tardó eso?». Esta guía se construye sobre una sola idea, porque en cuanto ves Timer como un cronómetro,
su trabajo de verdad (medir el rendimiento) y sus dos trampas (no-es-un-programador, el reinicio de
medianoche) salen solos.
Lo que aprenderás
- El modelo mental —
Timeres un cronómetro (mide el tiempo transcurrido), no una cuenta atrás ni un programador de tareas - Su trabajo de verdad — medir el rendimiento, y cómo demuestra que un interruptor de rendimiento de verdad ayudó
- La expectativa equivocada número uno — si quieres «ejecutar cada N minutos», quieres
Application.OnTime - El bug del reinicio de medianoche que produce tiempos transcurridos negativos, y la guarda para evitarlo
- Su resolución — alrededor de una centésima de segundo — y para qué sirve y para qué no
El modelo mental: un cronómetro que lees dos veces
Un cronómetro no hace que ocurra nada. No suena, no pausa la carrera, no da la salida a los corredores.
Solo te dice la hora en su esfera, y obtienes una duración leyéndolo dos veces y restando. Timer es
exactamente eso: llamarlo devuelve «los segundos desde medianoche» como un Single (así que Timer a las
00:01:30 devuelve 90.0), y mides cuánto tardó un código leyéndolo antes y después:
Dim t As Double
t = Timer ' lee la esfera: p. ej. 43521.14
' ... trabajo ...
Debug.Print Timer - t ' lee otra vez y resta: los segundos transcurridos
Aquí no hay ninguna «pausa» ni ningún «disparar más tarde». Timer nunca cambia lo que hace tu macro —
solo te dice cuánto duró una parte de ella. Si esperabas que Timer retrasara tu código, eso es
Sleep o Application.Wait, no Timer.
Su trabajo de verdad: demostrar que un cambio de verdad hizo la macro más rápida
El modelo del cronómetro apunta directo a para qué sirve Timer: medir el rendimiento. Cuando
apagas Application.ScreenUpdating, pasas Application.Calculation a manual o sustituyes un bucle celda a
celda por un array, no deberías creer que se hizo más rápido — deberías medirlo. Timer es cómo.
Sub ProveTheSwitchHelps()
Dim t As Double
t = Timer
Application.ScreenUpdating = True ' la forma lenta, a proposito
WriteTenThousandRows
Debug.Print "ScreenUpdating on: " & Format(Timer - t, "0.00") & "s"
t = Timer
Application.ScreenUpdating = False ' la forma rapida
WriteTenThousandRows
Application.ScreenUpdating = True
Debug.Print "ScreenUpdating off: " & Format(Timer - t, "0.00") & "s"
End Sub
Este es el complemento honesto a cada consejo de rendimiento:
ScreenUpdating, Calculation y los demás
valen la pena, pero Timer es cómo sabes que ayudaron a este libro en vez de repetir creencias
populares. También es cómo encuentras la línea lenta: envuelve unos cuantos sospechosos en lecturas de
Timer y deja que los números, no tu intuición, te digan a dónde se va el tiempo.
La expectativa equivocada número uno: Timer no es un programador de tareas
Este es el malentendido que manda a la mayoría a un buscador. Quieren que la macro se ejecute sola cada
5 minutos, o que haga algo tras un retardo, y dan por hecho que algo llamado Timer tiene que ser
eso. No lo es. Timer solo informa del tiempo transcurrido; nunca dispara nada.
Nombra lo que de verdad quieres:
- Ejecutar una macro más tarde, o según un horario que se repite («refresca cada 5 minutos», «ejecuta
a las 9 de la mañana») —
Application.OnTime. Le entrega a Excel una hora y un nombre de macro y programa la llamada. - Pausar la macro un retardo fijo —
Sleep(milisegundos) oApplication.Wait(segundos enteros). - Medir cuánto tardó algo —
Timer. Esta, y solo esta.
Si te pillas intentando construir un bucle de «repite cada N segundos» a partir de Timer, para: quieres
OnTime. Timer en un bucle solo quema la CPU leyendo el reloj.
El bug del reinicio de medianoche
Como Timer mide los segundos desde medianoche, se reinicia a 0 a medianoche. Así que una macro que
empieza a las 23:59:58 y termina a las 00:00:03 calcula Timer - t como aproximadamente
3 - 86398 = -86395 — un tiempo transcurrido negativo. Es raro, pero es real, y ha producido más de
un desconcertante informe de bug de «mi macro tardó menos veinticuatro horas».
Si una ejecución pudiera cruzar la medianoche alguna vez, protégete de ello, o mide con Now en su lugar:
Dim elapsed As Double
elapsed = Timer - t
If elapsed < 0 Then elapsed = elapsed + 86400 ' suma los segundos de un dia entero
Para cualquier cosa que pudiera correr durante horas, prefiere una temporización basada en fecha (Now, o
una combinación de Date + Timer) para que un cruce de medianoche no pueda corromper el resultado. Para
el caso común — cronometrar un bloque que dura segundos o minutos — el simple Timer - t es perfecto.
Resolución: una centésima de segundo
Timer se actualiza aproximadamente cada 10 milisegundos (más o menos una centésima de segundo) en
Windows. Es de sobra para responder las preguntas para las que sirve Timer: «¿es la versión A más rápida
que la B?», «¿cuánto tarda esta importación?», «¿cuál de estas tres líneas es la lenta?». No basta para
microbenchmarks — cronometrar algo que corre en bastante menos de una centésima de segundo simplemente
informará 0. Cuando necesites esa precisión, repite la operación miles de veces en un bucle y divide, o
baja a la API QueryPerformanceCounter. Para el trabajo cotidiano de «hazlo más rápido y demuéstralo»,
Timer es justo lo adecuado.
Cómo ayuda ExcelMaster
Timer es simple, pero usarlo bien es un pequeño paquete de hábitos: léelo en un Double, resta en el
orden correcto, aplica Format al resultado para que se lea bien, protege el caso de la medianoche en
ejecuciones largas y — la parte que la gente se salta — envuelve de verdad el código correcto para que
la medición signifique algo. Y cuando el objetivo es «ejecuta esto según un horario» o «pausa aquí»,
Timer es del todo la herramienta equivocada.
ExcelMaster elige la herramienta
adecuada para lo que describes. Pídele «cronometra cuánto tarda mi macro» y coloca una medición limpia
basada en Timer con un Debug.Print formateado; pídele «ejecuta esto cada cinco minutos» y monta
Application.OnTime en su lugar; pídele «pausa un momento» y echa mano de Wait o Sleep. Obtienes la
medición que querías, no un bucle de Timer fingiendo ser un programador de tareas.
Preguntas frecuentes
¿Cómo mido cuánto tarda una macro en VBA?
Lee la función Timer antes y después del código que quieres medir, y luego resta: t = Timer al
principio, y Debug.Print Timer - t al final. Timer devuelve los segundos desde medianoche como un
decimal, así que la diferencia es el tiempo transcurrido en segundos. Envuélvelo con Format(..., "0.00")
para un resultado legible.
¿La función Timer de VBA pausa mi código o lo ejecuta según un horario?
No. Timer solo informa de los segundos transcurridos desde medianoche — nunca pausa tu macro ni dispara
nada. Para pausar, usa Sleep o Application.Wait. Para ejecutar una macro más tarde o según un horario
que se repite, usa Application.OnTime. Timer es puramente un cronómetro para medir el tiempo
transcurrido.
¿Por qué mi tiempo transcurrido en VBA es negativo?
Porque Timer se reinicia a cero a medianoche. Si tu macro empieza justo antes de medianoche y termina
justo después, Timer - t resta un valor «de antes» grande de un valor «de después» pequeño y se vuelve
negativo. Protégete sumando 86400 (los segundos de un día) cuando el resultado es negativo, o mide con
Now para las ejecuciones que puedan cruzar la medianoche.
¿Cuál es la diferencia entre Timer y Application.OnTime?
Timer mide el tiempo transcurrido — lo lees para averiguar cuánto tardó un código. Application.OnTime
programa una macro para que se ejecute a una hora concreta o tras un retardo. La gente suele buscar
«vba timer» queriendo un programador de tareas; ese trabajo le corresponde a Application.OnTime, no a
Timer.
¿Qué precisión tiene la función Timer de VBA?
Timer resuelve alrededor de una centésima de segundo (unos 10 ms) en Windows. Es lo bastante preciso para
comparar dos enfoques o cronometrar una importación, pero las operaciones más rápidas que ~10 ms informarán
0. Para microbenchmarks, ejecuta la operación muchas veces y divide, o usa la API de Windows
QueryPerformanceCounter.
Probado en
Probado en: Excel 365 (Windows 11), VBA 7.1 — última verificación el 19/08/2026.
Guías relacionadas: VBA Wait · VBA Sleep · VBA ScreenUpdating · VBA Calculation · VBA DoEvents
