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

VBA Timer en Excel — mide cuánto tarda tu macro (y por qué no es un programador de tareas)

|

VBA Timer en Excel — mide cuánto tarda tu macro (y por qué no es un programador de tareas)

TL;DR — La función Timer no 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 — Timer es 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 fijoSleep (milisegundos) o Application.Wait (segundos enteros).
  • Medir cuánto tardó algoTimer. 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