C贸mo ejecutar una macro peri贸dicamente (cada cierto tiempo)

Tabla de Contenido

Si tienes una macro y quieres que se repita cada cierto tiempo o que no se ejecute hasta una hora determinada, esto es para ti.

Puede ser que quieras programar un recordatorio en Excel o que necesites ejecutar un proceso que se repita peri贸dicamente en tu trabajo.

Lo cierto es que en ocasiones nos hace falta darle ese toque autom谩tico a nuestras macros, es decir, que no necesiten de una persona pinchando el bot贸n cada vez.

Ejecutar una macro peri贸dicamente: La ausencia del control timer.

En otros 谩mbitos, como en los que se desenvuelven los programadores de Visual Basic cl谩sico y .NET, contamos con un timer que se encarga de este trabajo; pero en nuestro sencillo editor de VBA que tenemos en Excel, no existe tal opci贸n.

La idea es 芦simular禄 este efecto con un sencillo truco:

Vas a usar dos sub-rutinas: La primera se encargar谩 de 芦postergar禄 la ejecuci贸n de la segunda, un tiempo determinado. Entonces, cuando se ejecute la segunda macro, va a llamar a la segunda, de manera que 茅sta se encargue de programar la ejecuci贸n nuevamente.

驴Te he enredado? Pues mira, te dejo una imagen que lo aclara un poco:

Ejecutar macro peri贸dicamente

Esto funcionar谩 as铆:

  1. La primera sub-rutina 芦programarMacro()禄, va a ejecutar a 芦miMacro()禄; pero con un tiempo de retraso que t煤 definir谩s.
  2. Al cabo de ese tiempo se ejecutar谩 芦miMacro()禄 y 茅sta nuevamente llamar谩 a 芦programarMacro()禄. As铆 el ciclo se repite cada X segundos o minutos o incluso horas.

Preparando el terreno: Insertar un m贸dulo.

Esta macro no funcionar谩 si no la colocas en un m贸dulo. Quiero decir que no puedes colocarla en cualquier hoja, ni en el libro de trabajo. Debes escribir el c贸digo dentro de un m贸dulo. 驴Recuerdas que conversamos sobre c贸mo insertar un m贸dulo de VBA?

En este m贸dulo, declarar谩s dos variables para comenzar:

  1. Tiempo: Para definir el tiempo que tomar谩 el retraso que deseamos. Decl谩rala como Variant para el ejemplo.
  2. Ejecutando: Para saber en un momento dado si la macro se est谩 ejecutando o no. Decl谩rala como Boolean, porque solo queremos saber si es falso o verdadero su valor.

Ejecutar una macro periodicamente

Jugando con el tiempo: 聽Application.OnTime

驴Y c贸mo puedo hacer que una macro se ejecute con ese retraso del que hablo? Pues con el evento 芦OnTime禄 del objeto 芦Application禄.

Este evento se disparar谩 cuando se alcance el tiempo determinado por el usuario y ah铆 es donde t煤 debes indicar el valor que necesitas, ya sea en segundos, minutos u horas.

Para mi ejemplo, voy a usar el valor de un segundo.

Entonces, lo que tendr铆as que hacer es utilizar una variable y en ella colocar la suma de la fecha/hora actual y el tiempo dentro del cual quieres que se ejecute tu macro, algo as铆:

Now + TimeValue("00:00:01")

Esto da como resultado la fecha / hora; pero un segundo 芦en el futuro禄.

Luego, usaremos el evento OnTime del objeto Application,聽 el cual vendr铆a a comportarse como un timer. Este evento se activa cuando se alcanza el tiempo determinado por el usuario. 聽Lo usar谩s as铆:

Application.OnTime Tiempo, "miMacro", , True

Como ves, al evento Application.OnTime, le hemos pasado como primer argumento el tiempo que hemos determinado (un segundo) y como segundo argumento le hemos pasado el nombre de la macro que queremos que se ejecute (entre comillas, porque es un texto). En mi ejemplo, la macro se llama 芦miMacro禄.

El tercer argumento, lo dejo en blanco escribiendo solamente la siguiente coma y, finalmente, el cuarto argumento ser谩 un 芦True禄 (verdadero). Este 煤ltimo argumento especifica que la macro a ejecutar s铆 est谩 en espera de ser ejecutada.

Colocando el c贸digo.

Si juntamos todo el c贸digo y lo metemos dentro de una sub-rutina llamada 芦programarMacro禄, deber铆a de quedar as铆:

Sub programarMacro()
Tiempo = Now + TimeValue("00:00:01")
Application.OnTime Tiempo, "miMacro", , True
End Sub

Con esto, est谩s dici茅ndole a Excel que, luego de haber transcurrido un segundo, ejecute la macro 芦miMacro禄.

Ejecutar una macro periodicamente

Si quisieras, podr铆as usar este 芦truco禄 para hacer que tus macros se ejecuten despu茅s de un tiempo de haber pinchado en un bot贸n. Algo as铆 como una alarma o un recordatorio, etc.

驴Y qu茅 har谩 la segunda sub-rutina?

La segunda sub-rutina, no har谩 nada complicado, para facilitar el ejemplo. Lo 煤nico que quiero que haga, es incrementar un contador (que estar谩 en una celda), de manera que parezca un reloj que va avanzando cada segundo: 1, 2, 3… etc.

驴Sencillo, no?

Bien, 驴y c贸mo har铆a eso? 驴C贸mo puedo incrementar el valor de una celda?

隆Usando la propiedad 芦Value芦!

Elijamos una celda cualquiera, digamos la celda D5. En esta celda quiero que se incremente en una unidad su valor. Entonces lo har铆a as铆:

Range("D5").Value = Range("D5").Value + 1

Lo que est谩s dici茅ndole a Excel con este c贸digo es:

En el rango D5 (la celda D5), al valor actual que tiene, le vas a colocar el resultado de sumarle el mismo valor, m谩s una unidad.

Entonces, si el valor era cero, ahora ser谩 uno. Si el valor era uno, ahora ser谩 dos… Y as铆, sucesivamente.

Este c贸digo lo vas a poner en otra sub-rutina, la cual se llamar谩 芦miMacro禄, as铆:

Sub miMacro()
Range("D5").Value = Range("D5").Value + 1
End Sub

Ahora, cada vez que se ejecute esta sub-rutina, el valor de la celda D5 se incrementar谩 en una unidad.

S铆, pero…

Esto suceder谩 una sola vez, ya que desde la sub-rutina 芦programarMacro禄 le dijimos que active la segunda sub-rutina, despu茅s de un segundo de haberla ejecutado… Pero esto solo sucede una vez 隆y nunca m谩s!

驴C贸mo hacer que la sub-rutina se repita nuevamente, una y otra vez?

Pues, es m谩s sencillo de lo que parece. 驴Recuerdas la primera imagen que coloqu茅 al iniciar este art铆culo? En ese gr谩fico puedes ver que las dos sub-rutinas se llaman entre s铆. Es una especie de 芦llamada cruzada禄. Ahora vamos a hacer que la segunda 芦le responda禄 a la primera y as铆 conseguimos un efecto de recursividad.

Al final del c贸digo de la sub-rutina 芦miMacro禄, vas a colocar la l铆nea:

Call programarMacro

Call, es una palabra reservada que sirve para invocar a una sub-rutina o funci贸n, desde otra porci贸n de c贸digo similar.

Entonces, el c贸digo completo, deber铆a de quedar as铆:

Sub miMacro()
Range("D5").Value = Range("D5").Value + 1
Call programarMacro
End Sub

Ahora s铆, cuando 芦programarMacro禄 ejecute a 芦miMacro禄, esta 煤ltima ejecutar谩 de nuevo a la primera, la cual volver谩 a llamar a la segunda y as铆, infinitamente.

Y como 芦programarMacro禄, tiene un retraso de un segundo, se comportar谩 como un relojito que avanza un paso a la vez, cada segundo.

Adem谩s, la sub-rutina 芦miMacro禄, va incrementando el valor de la celda D5 en una unidad cada vez. Lo que dar谩 la ilusi贸n de que se trata de un cron贸metro digital que va corriendo, segundo a segundo.

隆Interesante! 驴No es verdad?

Ejecutar una macro periodicamente

Im谩ginate las cosas que podr铆as hacer a partir de este sencillo truco 馃檪

隆Perfecto! Pero, 驴c贸mo hago para iniciar y detener mi nuevo cron贸metro?

Pues, hagamos dos sub-rutinas m谩s. La primera se llamar谩 芦iniciarReloj禄 y la segunda… 隆Pues s铆! Se llamar谩 芦detenerReloj禄 馃榾

La primera sub-rutina, 芦iniciarReloj禄, solo va a llamar por primera vez a la sub-rutina 芦programarMacro禄. Ser谩 como nuestro motor de arranque.

Sub iniciarReloj()
Ejecutando = True
Call programarMacro
End Sub

Nota que tambi茅n he colocado el valor 芦True禄 a la variable 芦Ejecutando禄, para que nuestra aplicaci贸n ‘sepa’ que el cron贸metro se est谩 ejecutando.

Ahora, la segunda sub-rutina, 芦detenerReloj禄, tambi茅n ser谩 sencilla y tendr谩 dos l铆neas de c贸digo.

Sub detenerReloj()
Ejecutando = False
Application.OnTime Tiempo, "miMacro", , False
End Sub

Aqu铆 tambi茅n he usado la variable 芦Ejecutando禄 y le he asignado el valor 芦False禄, para indicar que nuestro cron贸metro ya no se est谩 ejecutando.

Como puedes ver tambi茅n, he configurado nuevamente el evento 芦OnTime禄 del objeto 芦Application禄. El c贸digo es casi id茅ntico, pero con la diferencia de que en lugar de colocar 芦True禄 en el 煤ltimo argumento, ahora uso el valor 芦False禄.

驴Y qu茅 quiero decir al colocar 芦False禄?

Pues que ahora, esa sub-rutina ya no est谩 en espera de ser ejecutada. As铆 que, si por alguna raz贸n le faltaba una ejecuci贸n por realizar, esta se cancela.

Este paso es 煤til cuando tienes per铆odos de tiempo m谩s largos que un segundo como por ejemplo, una espera de una hora, y quieres cancelar esa ejecuci贸n futura.

El c贸digo completo.

Al final, el c贸digo completo deber铆a de quedarte as铆:

Ejecutar una macro periodicamente

Toques finales.

Como paso final, vas a asignar las macros a un par de botones con los nombres apropiados y pasar谩s directamente a probar tu flamante aplicaci贸n 馃榾

Ejecutar una macro periodicamente

驴Qu茅 no recuerdas c贸mo asignar macros a un bot贸n?

Pues mira, aqu铆 te dejo un art铆culo en el que ya lo hicimos. Solo pincha aqu铆.

Descarga el archivo terminado.

Pues despu茅s de tanto trabajo, solo nos falta ver el c贸digo terminado, 驴verdad? 隆Pues s铆! Entonces, aqu铆 te dejo el enlace al archivo terminado para que pruebes en tu casa y compares con lo que tienes, por si acaso te encuentras con alg煤n inconveniente mientras practicas lo aprendido.

Solo haz clic en el bot贸n y sigue las instrucciones. 隆Es Gratis!

Eso es todo.

Ahora te toca a ti. Pon en pr谩ctica lo aprendido o vas a olvidarlo muy pronto. Si no tienes en qu茅 usar este ejemplo… 隆pues inv茅ntatelo! No dejes que la procrastinaci贸n se apodere de ti, o el tiempo te va a sorprender alg煤n d铆a.

Si te ha gustado este art铆culo, no dejes de compartirlo en las redes sociales, usando los botones de abajo. As铆 ayudamos a que m谩s personas aprendan a dominar Excel, paso a paso 馃榾

隆Nos vemos!

[firma]

Nuestra puntuaci贸n
隆Punt煤a esta entrada!
(Votos: 3 Promedio: 5)
C贸mo ejecutar una macro peri贸dicamente (cada cierto tiempo)
Si tienes una macro y quieres que se repita cada cierto tiempo o que no se ejecute hasta una hora determinada, esto es para ti.