¿VBA excel - Como demorar una instrucción hasta que acabe la anterior?

Mensualmente tengo que actualizar (SOLO ACTUALIZAR) casi 80 ficheros de excels y mi idea era hacerlo desde un fichero "madre" lanzando instrucciones de VBA por etapas. He logrado que la macro abra tal fichero, actualice todas las tablas dinámicas, pero no puedo guardarlo dado que nunca se cuantos segundos tardará dicha actualización de las tablas.
¿Saben cómo puedo hacer que la instrucción "guardar fichero" espere a que termine la instrucción de "refresh all"? Muchas gracias

De momento el código es:

Sub Refresh()

Workbooks.Open Filename:="C:\Users\Gonzalo.SalleMato\OneDrive - Zurich Insurance\TEST\test.xlsx"

ActiveWorkbook.RefreshAll

En sub

2 respuestas

Respuesta

H0la Gonzalo:

Hasta donde sé, dentro de un evento VBA trabaja de forma secuencial, por lo que ejecuta una instrucción tras otra.

¿Has probado lo siguiente?

Sub Refresh()
Workbooks.Open Filename:="C:\Users\Gonzalo.SalleMato\OneDrive - Zurich Insurance\TEST\test.xlsx"
ActiveWorkbook.RefreshAll
'Guardar luego de refrescar'
ActiveWorkbook. Save
En sub

Eso debiera resultar, si no es así, creo que me pondré a estudiar :).

S@lu2

gracias eso he probado inicialmente pero cuando cierra el libro (ActiveWindow.Close) me indica que detendrá la actualización.

¿Y qué sucede si cierras el libro luego de que termine el guardado?

Private Sub Workbook_AfterSave(ByVal Success As Boolean)
    ActiveWindow.Close
End Sub
Respuesta

[Hola

Déjalo así:

Workbooks.Open Filename:="C:\Users\Gonzalo.SalleMato\OneDrive - Zurich Insurance\TEST\test.xlsx"
ActiveWorkbook.RefreshAll
Do While Application.CalculationState <> xlDone
    DoEvents
Loop
'Y aquí lo que quieras después de actualizar

Comentas

Abraham Valencia

Gracias! He probado lo que comentas pero parece que la actualizacion queda en un loop, es decir nunca termina (mientras que si lo hago manualmente tarde menos de 10 segundos). Se te ocurre por que?

Sub Refresh()

Workbooks.Open Filename:="C:\Users\Gonzalo.SalleMato\OneDrive - Zurich Insurance\TEST\test.xlsx"
ActiveWorkbook.RefreshAll
Do While Application.CalculationState <> xlDone
DoEvents
Loop
ActiveWorkbook.Save
ActiveWindow.Close

End Sub

Esas tablas dinámicas ¿de dónde extraen los datos?

Abraham Valencia

Leen de un access. Crees que esto puede afectar? Si le doy "refresh" manualmente actualiza perfecto y rápido. gracias

En las propiedades de la conexión, desmarca la opción para: "Habilitar la actualización en segundo plano". Una vez hecho eso, guarda al archivo. Corre la macro. Debería funcionar.

Abraham Valencia

PD: De no resultar hay una forma más

Surge el siguiente error:

Je je je... último intento:

Workbooks.Open Filename:="C:\Users\Gonzalo.SalleMato\OneDrive - Zurich Insurance\TEST\test.xlsx"
ActiveWorkbook.RefreshAll
Application.CalculateUntilAsyncQueriesDone

Saludos]

Abraham Valencia

¡Gracias! Genial!!! ahora si ha funcionado!!
Muchas gracias...

Ahora me toca extender esto a los 80 ficheros separados por grupos pero creo con esto funcionara perfectamente! muchas gracias por tu ayuda

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas