¿Qué código de VB usar para que la macro no pase al siguiente paso si no ha acabado el anterior?

Tengo el siguiente código:

Sub Macro1()

' Para actualizar las tablas dinamicas
ActiveWorkbook. RefreshAll
End Sub

Sub Macro2()
'Optimizar
Application.ScreenUpdating = False
 Application.Calculation = xlCalculationManual
 Application.EnableEvents = False
 ActiveSheet.DisplayPageBreaks = False

'Activo hoja Plantilla
Sheets("Plantilla").Select
    ' Para transformar las columnas 2 y 8 que tienen formato texto en número:
    loca = False
    i = 5
   
    Do Until loca = True
    loca = IsEmpty(Worksheets("Plantilla").Cells(i, 2))
    Worksheets("Plantilla").Cells(i, 2).Value = Worksheets("Plantilla").Cells(i, 2) * 1
    Worksheets("Plantilla").Cells(i, 8).Value = Worksheets("Plantilla").Cells(i, 8) * 1
    i = i + 1
    Loop

    'Para reemplazar los # por Ñ:
    ActiveSheet.Cells.Replace What:="#", Replacement:="Ñ", LookAt:=xlPart
 
 
 'Activo hoja Bajas
    Sheets("Bajas").Select
    ' Para transformar las columnas 2 y 8 que tienen formato texto en número:
    loca = False
    i = 5
   
    Do Until loca = True
    loca = IsEmpty(Worksheets("Plantilla").Cells(i, 2))
    Worksheets("Bajas").Cells(i, 2).Value = Worksheets("Bajas").Cells(i, 2) * 1
    Worksheets("Bajas").Cells(i, 8).Value = Worksheets("Bajas").Cells(i, 8) * 1
    i = i + 1
    Loop

    'Para reemplazar los # por Ñ:
    ActiveSheet.Cells.Replace What:="#", Replacement:="Ñ", LookAt:=xlPart
   
    'Activo hoja Plantilla
Sheets("Plantilla").Select

    'Optimizar
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
    Application.EnableEvents = True
    ActiveSheet.DisplayPageBreaks = True
    Application.CutCopyMode = False
   

End Sub

Sub Macro3()
 
 Call Macro1
 Call Macro2
 
End Sub

El problema es que antes de que acabe de ejecutarse la Macro1 (actualiza las tablas del documento)se ejecuta la Macro2, por lo que necesito poner algo para que primero se ejecute la Macro1 y cuando esta acabe empiece la Macro2.

2 Respuestas

Respuesta
1

H o l a : Podemos poner una pausa de tiempo, para esperar a que termine la macro1. Por ejemplo, en la siguiente instrucción, la pausa es de 5 segundos:

Sub Macro3()
    Call Macro1
    '
    DoEvents
    Application. Wait Now + TimeValue("00:00:05")
    DoEvents
    '
    Call Macro2
End Sub

La macro1 termina, espera 5 segundos y hace el llamado a la macro2. Cambia el "05" por un número mayor si no es suficiente.

Si es lo que necesitas, recuerda valorar la respuesta.

No funciona, retrasa la ejecución de la Macro1 también.

No funciona, retrasa la ejecución de la Macro1 también.

No entiendo cómo va a retrasar la macro1, la instrucción del wait está después de la macro1.

Si eso no funciona, entonces tendrás que hacerlo manualmente, ejecutar la macro1, esperar a que termine, revisar que los datos estén actualizados y entonces ejecutar la macro2.

No sé qué tienes en el libro, qué estás actualizando con el "ActiveWorkbook. RefreshAll", que esté retrasando tanto tiempo. Podrías comentar qué es lo que actualizas.

Actualiza dos requetés de Business Objects una en la hoja Plantilla y otra en la hoja Bajas, que tardaran como unos 5 -10 segundos en actualizarse manualmente.

No me confirmaste esta parte:

"No entiendo cómo va a retrasar la macro1, la instrucción del wait está después de la macro1. "


Antes de ejecutar la macro1 cómo tienes esto:

Application. Calculation

¿Lo tienes en automático? Revisa que esté en automático, de esa forma se actualizarán los valores de la hoja.

Respuesta

Pon Call Macro2 al final de Macro1 y puedes borrar la Macro3:

Un saludo

No funciona

Sub Macro1()

' Para actualizar las tablas dinámicas
ActiveWorkbook. RefreshAll

Call Macro2
End Sub

Así debe quedar la Macro1 y tienes que Ejecutar la Macro1

¿

¿Así funciona?

Un saludo

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas