Poder seguir usando excel teniendo una macro ejecutándose

Tengo este código que me ejecuta una macro cada 5 minutos, la macro apenas tarda 30 segundos en ejecutarse pero a pesar de tener metido un DoEvents no me deja seguir trabajando en excel con otros libros, ¿Sabéis alguna manera de poder ejecutar esta macro periódica y poder trabajar con otros libros?.

Sub Macro2()
'
' Macro2 Macro
'
ShowModal = False

Dim ComienzoSeg As Single
Dim FinSeg As Single
Dim R As Double

R = 0
TIEMPO_ESP_MAX = 300 'ESTABLECES EL TIEMPO DE ESPERA EN SEGUNDOS
Do While R = O
'
ComienzoSeg = Timer
FinSeg = ComienzoSeg + TIEMPO_ESP_MAX
Do While FinSeg > Timer
DoEvents
TChecq1 = Round(FinSeg - Timer, 0)
If TChecq1 <> TChecq2 Then
TChecq2 = TChecq1
End If
If ComienzoSeg > Timer Then
FinSeg = FinSeg - 24 * 60 * 60
End If
Loop
Macro1
Loop

End Sub

1 Respuesta

Respuesta
1

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

':)
':)

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas