VBA последовательный запуск макросов в Excel

Макрос запускает другие макросы последовательно. Макросы работают с Excel таблицами. Нужно запускать макрос, если выполнение предыдущего завершено.

В текущем варианте:

Sub ОбновитьБазу()
    Application.Run "Открыть"
    Application.Run "Загрузка"
    Application.Run "Выгрузка"
    Application.Run "Закрыть"
End Sub

Некоторые макросы, разумеется, начинают работать раньше, чем завершаются предыдущие.

Из вариантов решения на ум приходят:

  • счетчик и его отслеживание
  • запуск по времени

Но я уверена, есть какое-то более правильное и красивое решение.


Ответы (1 шт):

Автор решения: Gregory

Application.Run - это не самый простой и широко используемый способ запускать макросы (программы, функции) в VBA. Не углубляясь в детали, для Вашего случая подойдут такие способы:

  • имя_программы (макроса) и без скобок перечисление аргументов через запятую
  • Call имя_программы и в скобках перечисление аргументов через запятую.

Ниже - пример тестовой программы с обоими типами синтаксиса. По результатам выполнения видно, что программы выполняются строго последовательно, а не одновременно, как в Вашем случае.

Sub TEST()
Dim wait_sec_1 As Integer, wait_sec_2 As Integer
    wait_sec_1 = 10
    wait_sec_2 = 5
    
    Macros1 wait_sec_1
    Macros2 wait_sec_2
    
    Call Macros1(wait_sec_1)
    Call Macros2(wait_sec_2)
    
End Sub


Sub Macros1(wait_sec_1 As Integer)
Dim i As Integer
    For i = 0 To wait_sec_1
        Application.Wait(Now + TimeValue("0:00:01")): DoEvents 'one second wait
    Next i
    Debug.Print "First Macros work end"
End Sub

Sub Macros2(wait_sec_2 As Integer)
Dim i As Integer
    For i = 0 To wait_sec_2
        Application.Wait(Now + TimeValue("0:00:01")): DoEvents 'one second wait
    Next i
    Debug.Print "Second Macros work end"
End Sub
→ Ссылка