H o l a:
Lo que hace la instrucción DoEvents es actualizar la información. Pero el control de la ejecución la tiene todavía el libro de la macro, es decir, la macro está en un loop y no va a soltar el control hasta que termine el loop.
Lo que puedes hacer es ejecutar el método OnTime, en este método estableces cada cuanto tiempo quieres que se ejecute la macro.
Lo siguiente es lo que se puede hacer:
Primero, tenemos la macro "iniciar" que es el disparador de la macro2.
Observa como al principio de las macros, está declarada la variable "detener".
Lo que tenemos en la macro "iniciar", es una especie de contador, el contador lo puedes poner en cualquier celda.
Segundo, la macro2 se va a estar ejecutando cada 5 segundos.
Puedes cambiar el lapso de tiempo en esta parte, por ejemplo a cada 30 segundos:
Application. OnTime Now + TimeValue("00:00:30"), "macro2",, True
Tercero, la macro2 ejecuta a la macro1. La macro1 se va a ejecutar hasta que la variable "detener" cambie a True
Por último, en la macro1, tienes que poner una condición, cuando se cumpla dicha condición la variable "detener" debe cambiar a True, en ese momento la macro se detiene.
En mi ejemplo, puse un contador, cuando el contador sea mayor a 3, entonces la macro se detiene.
Después de la condición, puedes poner el código que quieres que se ejecute. Recuerda que si estás en otro libro, y la macro1 actualiza datos del libro1, entonces tienes que hacer referencia al libro1, ya que si no haces referencia y estás en el libro2, puede ser que se actualicen celdas del libro2.
Cuando la macro esté en ejecución, entonces puedes cambiarte de libro y trabajar en otros libros.
La macro completa:
Dim detener
'
Sub iniciar()
'Por.Dante Amor
Set l1 = ThisWorkbook
Set h1 = l1.Sheets("Hoja1") 'hoja con el contador
h1.[A5] = 1 'Se inicia el contador en 1 en alguna celda
detener = False 'se inicia detener igual a False
Call Macro2 'Se ejecuta la macro2
End Sub
'
Sub Macro2()
'Por.Dante Amor
If detener Then
MsgBox "La macro terminó"
Exit Sub
End If
'La macro2 se va a ejecutar cada 5 segundos
Application.OnTime Now + TimeValue("00:00:05"), "macro2", , True
macro1
End Sub
'
Sub macro1()
'Por.Dante Amor
'En esta parte hay que poner una condición.
'Cuando se cumpla la condición entonces la variable detener cambia a True
Set l1 = ThisWorkbook
Set h1 = l1.Sheets("Hoja1") 'hoja con el contador
If h1.[A5] > 3 Then 'si el contador es mayor a 3 termina la macro
detener = True
Exit Sub
End If
h1.[A5] = h1.[A5] + 1 'Se incrementa el contador
'
'En esta parte va tu macro
End Sub
':)
':)