Está en la página 1de 22

Raymundo Ycaza

MAIN MENU

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

Blog ➤ Programación para la oficina (macros)

Share on facebook

Facebook

Share on twitter

Twitter

Share on linkedin

LinkedIn

Share on whatsapp

WhatsApp

Raymundo Ycaza

20 Comentarios

¡Puntúa esta entrada!

(Votos: 0 Promedio: 0)

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í:

La primera sub-rutina “programarMacro()”, va a ejecutar a “miMacro()”; pero con un tiempo de


retraso que tú definirás.

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:

Tiempo: Para definir el tiempo que tomará el retraso que deseamos. Declárala como Variant
para el ejemplo.

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]

Otras entradas en esta categoría

Cómo crear un catálogo de imágenes en Excel, sin utilizar macros

LEER MÁS »
6 comentarios

Autosuma con Varios Rangos

Aprende cómo realizar una Autosuma con Varios Rangos y Multiselección

LEER MÁS »

1 comentario

Tablas Auxiliares

Cómo evitar las Tablas Auxiliares en Excel

LEER MÁS »

1 comentario

20 comentarios en “Cómo ejecutar una macro periódicamente (cada cierto tiempo)”

CESAR

19 DE ENERO, 2016 A LAS 3:37

No se si te estoy contestando tarde, pero bueno, te va mi idea. Hay una forma de que se ejecute
una subrutina cualquiera, cada vez que se abre el libro. Lo único que deberás hacer es poner la
condición en esa subrutina.

Por ejemplo, mi subrutina del libro que estoy utilizando ahora se llama “AbrirExcel”, y se ejecuta
cada vez que se abre el libro. Abriendo el editor de VB vas a ver en el final de donde están las
hojas del libro una que se crea automáticamente llamada ThisWorkbook. En esa hoja colocas lo
siguiente:

Private Sub Workbook_Open()

AbrirExcel

End Sub

De esta manera, se va a ejecutar la subrutina “AbrirExcel” cada vez que se abra el libro. Luego
dentro de la misma simplemente tenes que colocar un “If” (por ejemplo) cuya condición compare
una fecha colocada en una celda con otra donde una de ellas debe tener la fecha actual. Si la
condición se cumple se ejecuta lo que vos quieras, de lo contrario nada.
Espero que te sirva, saludos!

Responder

MIGUEL SILVA MORAGA

6 DE AGOSTO, 2016 A LAS 8:03

Hola Raymundo, como lo puedo hacer para que un numero determinado vaya incrementando de
uno en uno pero cada 1 hora??? en excel, es que necesito una especie de contador de unidad
pero cada 1 hora…

Muchas gracias

Responder

RAYMUNDO YCAZA

21 DE AGOSTO, 2016 A LAS 0:05

Hola, Miguel. Pues sería de reemplazar la función que tienes en el ejemplo, por una que haga lo
que indicas. En el timevalue en lugar de poner un segundo, pondrías una hora, así: 01:00:00

Luego si, por ejemplo, el número lo tenemos en la celda A3:

function funcion_a_ejecutarse()

range(“A3”).value = range(“A3”).value + 1

end function

Si tienes el número en una variable:

function funcion_a_ejecutarse()
mi_numero = mi_numero +1

end function

Saludos

Responder

LUIS MANUEL GALEANA OROZCO

12 DE SEPTIEMBRE, 2016 A LAS 12:02

Buenos dias

podrias compartir el archivo final, el link al que manda tu descarga ya no funciona

Responder

VICTOR RAMOS

28 DE SEPTIEMBRE, 2016 A LAS 14:02

EXCELENTE APORTE, MUCHAS GRACIAS!!

Responder

ADRIAN

11 DE OCTUBRE, 2016 A LAS 14:34

ray una pregunta use la macro para automatizar un proceso cada tanto tiempo, el problema es
🙁
que si tengo abierto otro libro el proceso bota un error
Responder

FRAN MONTERO

24 DE OCTUBRE, 2016 A LAS 14:20

Hola como estas.

Mi consulta es la siguiente, yo trabajo con los dashbord en excel el cual esta conectada a una
base de datos (SQL SERVER) y estos dashbord hay que estarlos actualizando manualmente, cosa
que he querido eliminar y hacerlo automatico, ahora bien este dato que nos diste esta genial,
pero el problema que tengo, es que cada que actualizo esto manualmente, hay que ingresar el
usuario y contraseña para poder extraer los datos de sql y refrescar el archivo de excel.

Entonces como debe de ir el codigo (por asi decirlo) en la macro para meter estos datos y que
corra el scrip sin que yo intervenga…..

Responder

EDWIN CORONA GARCIA

10 DE NOVIEMBRE, 2016 A LAS 19:41

Tuve un problema con la Pila, al crear una sentencia como esta, ya que me marca “error 28 en
tiempo de ejecución: espacio de pila insuficiente”. Me puedes ayudar con esto?

Option Explicit

Dim Tiempo As Variant

Dim Ejecutando As Boolean

Sub ProgramarMacro()
Tiempo = Now + TimeValue(“00:00:01”)

Application.OnTime Tiempo, “MiMacro”, , True

End Sub

Sub MiMacro()

Range(“G1”).Value = Range(“G1”).Value + 1

Call ProgramarMacro

If Range(“G1”).Value = Range(“G2”).Value Then Call Captura_Datos

If Range(“G1”).Value = Range(“G2”).Value Then Range(“G1”) = 0

End Sub

Sub DetenerReloj()

Ejecutando = False

Application.OnTime Tiempo, “MiMacro”, , False

End Sub
Sub IniciarReloj()

Ejecutando = True

Call ProgramarMacro

End Sub

Responder

LILIANA VELAZQUEZ NIEVES

12 DE DICIEMBRE, 2016 A LAS 14:56

Hola esta muy bueno tu aporte, me podrías ayudar a programar un macro que ciertas celdas se
puedan escribir datos y pasados los 15 minutos se bloque las celdas y para poder actualizarlas te
pida contraseña y pinte la celda de rojo indicando que este dato se paso de los 15 minutos

Responder

KAREN AGUILAR

12 DE ABRIL, 2017 A LAS 3:01

Hola me podría ayudar con una macro

En mi trabajo utilizamos instrumentos que deben ser verificados cada año. Realicé una tabla con
un formulario que pide los datos del instrumento, la fecha de verificación y la frecuencia de ésta
(1 año, 2años, etc.) pero quiero que me informe dos semanas antes de que la verificación se debe
realizar y el mismo día de la verificación y que cuando ya paso la fecha se actualice para la
siguiente verificación.

Al mismo tiempo que envíe una alerta a Outlook.


Espero me pueda ayudar y gracias.

Responder

RAYMUNDO YCAZA

12 DE ABRIL, 2017 A LAS 10:11

Hola, Karen.

En esta entrada, trato de algo parecido, que utiliza fechas y puedes usarlo como referencia:
http://www.raymundoycaza.com/agenda-en-excel-1/

Para comparar en días o meses, podrias usar la función DATEDIFF, mientras que para actualizar
la fecha, sumandole dias o meses, podrias usar la función DATEADD.

Ya me contarás.

Saludos

Responder

SABRINA

27 DE ABRIL, 2017 A LAS 9:25

Hola, necesito ayuda con una programacion como esta, pero lo quiero es una macro que cada 2
minutos cambie de sheet. es entre tres y que vaya cambiando cada 2 minutos infinitamente.

Responder
TAVINNI MTZ H

5 DE JUNIO, 2017 A LAS 12:59

Hola, buen día…

Tengo est código que tengo en VBAProject en la parte de ThisWorkbook…

Private Sub Workbook_Open ( )

Aplication.Ontime TimeValue (“00:00:00”), “DataTime_00_00”

Aplication.Ontime TimeValue (“01:00:00”), “DataTime_01_00”

Aplication.Ontime TimeValue (“02:00:00”), “DataTime_02_00”

Aplication.Ontime TimeValue (“23:00:00”), “DataTime_23_00”

End Sub

Cada hora ejecuta la rutina especificada, pero tengo el problema que, si por ejemplo el libro lo
abro a las 12:45 hrs, comienza a ejecutar las macros desde las 13 hrs, ejecuta 23 rutinas
restantes, pero a las 13 hrs del siguiente día se detiene, ya no ejecuta nada, y tengo que cerrar y
abrir el libro.

Esto no me es funcional, ya que quiero que lo haga de manera que no se detenga. Ojalá me
puedas ayudar.

Responder

JULIO CÉSAR RODRÍGUEZ PIMIENTO

22 DE OCTUBRE, 2017 A LAS 11:53

hay un error grave en esto.

Responder

JULIO CÉSAR RODRÍGUEZ PIMIENTO

22 DE OCTUBRE, 2017 A LAS 11:54

no puedes confundir miMacro que es una macro con miMacro del cronómetro que es una
subrutina. No funciona

Responder

JORGE

21 DE JUNIO, 2019 A LAS 8:52

Estimado Raymundo, teniendo como base tu explicación intento hacer una macro pero aún no lo
consigo.

La idea es que por medio de un UserForm donde hayan 3 textboxs y un botón para ejecutar, el
usuario coloque la “hora”, “minutos” y “segundos” respectivamente en que quisiera que se vuelva
a ejecutar una macro que tengo realizada.

En tu ejemplo somos capaces de colocar el tiempo desde código, pero lo que busco es que esa
opción este disponible para un usuario.

Por favor ayuda en esto!! gracias de antemano.

Responder

ANDRES

17 DE JULIO, 2019 A LAS 15:33

No hay link de decarga, lo puedes resubir? Gracias de antemano.

Responder

CRISTIAN

25 DE MAYO, 2020 A LAS 4:55

Hola Raymundo, intente hace un parpadeo de celda pero que mantenga el color original de la
celda, y no sé como hacerlo, no me resulta, he intentado muchas veces, pero algo no debo estar
considerando. Agradezco tu ayuda.

Lo que finalmente quiero hacer es que la celda parpadee si es que tien un dato. Si está vacía,
para el parpadeo, pero nunca cambie el color original.

Gracias.
Responder

ENRIC RIERA VALLS

4 DE JUNIO, 2020 A LAS 12:37

Lo he encontrado de una claridad excepcional. Felicidades y muchas gracias.

Enric

Responder

CLAUDIO RENGIFO

17 DE MAYO, 2021 A LAS 14:46

Excelente gracias

Responder

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados
con *

Escribe aquí...

Escribe aquí...

Nombre*

Nombre*

Correo electrónico*

Correo electrónico*

Web
Web

Guardar mi nombre, correo electrónico y sitio web en este navegador para la próxima vez que
haga un comentario.

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus
comentarios.

Contrata Mis Servicios

HOME

BLOG

VIDEOS

ACERCA DE…

CURSOS

Raymundo Ycaza

Creo que cada persona en el mundo, puede construir sus posibilidades: una mejor versión de sí
misma.

Servicios

Cursos de Excel

Consultoría informática

Accesos Directos

Sobre mí
Todos los cursos

Recursos

Blog

Contáctame

Contáctame

José Mascote 3005

Guayaquil - Ecuador

Llámame 0959076237

Envíame un mensaje

Imagen de portada creada por upklyak

Aviso Legal

Política de Privacidad

Política de Cookies

Este blog utiliza cookies para mejorar la experiencia de navegación. Si continuas

También podría gustarte