Задержка операций с кодом VBA без замораживания Excel

Я пишу макрос VBA, который просто откроет другую книгу, обновит все, сохранит, а затем закроет. Это повторит это со второй книгой. Затем он обновляет и сохраняет основную книгу, из которой был запущен код VBA. Проблема, с которой я сталкиваюсь, заключается в том, что две открытые книги используют запросы Microsoft для извлечения данных из нашей базы данных JobBoss и она предназначена для обновления этих данных при открытии файла. Таким образом, файл открывается, начинает обновлять данные запроса, а затем код VBA пытается обновить в то же время, вызывая ошибку. Кроме того, он не дожидается, когда данные закончат обновление, прежде чем пытаться сохранить и закрыть его.

Есть ли способ отложить каждую операцию без замораживания приложения Excel?

Я пробовал application.wait но Excel замораживается в течение этого времени, и данные не обновляются в фоновом режиме, как только время закончится. Excel размораживается, и я все еще получаю сообщение об ошибке при попытке выполнить операцию во время обновления.

Это то, что у меня есть до сих пор:

Sub Refresh_All()
'
' Refresh_All Macro
'
' Keyboard Shortcut: Ctrl+r
'
    ChDir "Q:\Quality Control"
    Workbooks.Open Filename:= _
        "Q:\Quality Control\Internal Failure Log - Variable Month.xlsm"
    ActiveWorkbook.RefreshAll
    ActiveWorkbook.Save
    ActiveWindow.Close
    ChDir "Q:\Reports"
    Workbooks.Open Filename:= _
        "Q:\Reports\Finished-Transfer Report-variable month.xlsm"
    ActiveWorkbook.RefreshAll
    ActiveWorkbook.Save
    ActiveWindow.Close
    ActiveWorkbook.RefreshAll
    ActiveWorkbook.Save
End Sub
+1
источник поделиться
3 ответа

Этот код работает после включения и отключения обновления фона во всех моих таблицах запросов.

Sub Refresh_All()
'
' Refresh_All Macro
'
' Keyboard Shortcut: Ctrl+Y
'
    ChDir "Q:\Quality Control"
    Workbooks.Open Filename:= _
        "Q:\Quality Control\Internal Failure Log - Variable Month.xlsm"
    Dim endTime As Date
    endTime = DateAdd("s", 2, Now())
    Do While Now() < endTime
DoEvents
    Loop
    ActiveWorkbook.RefreshAll
       endTime = DateAdd("s", 10, Now())
    Do While Now() < endTime
        DoEvents
    Loop
ActiveWorkbook.Save
    endTime = DateAdd("s", 5, Now())
    Do While Now() < endTime
        DoEvents
    Loop
    ActiveWindow.Close
    ChDir "Q:\Reports"
    Workbooks.Open Filename:= _
        "Q:\Reports\Finished-Transfer Report-variable month.xlsm"
        endTime = DateAdd("s", 2, Now())
    Do While Now() < endTime
        DoEvents
    Loop
ActiveWorkbook.RefreshAll
     endTime = DateAdd("s", 10, Now())
    Do While Now() < endTime
        DoEvents
    Loop
ActiveWorkbook.Save
        endTime = DateAdd("s", 5, Now())
    Do While Now() < endTime
        DoEvents
    Loop
ActiveWindow.Close
    ActiveWorkbook.RefreshAll
        endTime = DateAdd("s", 10, Now())
    Do While Now() < endTime
        DoEvents
    Loop
ActiveWorkbook.Save
End Sub
+1
источник

Проверь это,

Возможно, вам придется сделать некоторые изменения, но, я считаю, вы получите эту идею.

Sub Button1_Click()
    Dim wb As Workbook, bk As Workbook, bk2 As Workbook

    Set wb = ThisWorkbook
    Set bk = Workbooks.Open("Q:\Quality Control\Internal Failure Log - Variable Month.xlsm")
    Set bk2 = Workbooks.Open("Q:\Reports\Finished-Transfer Report-variable month.xlsm")

        With bk
            .RefreshAll
            .Save
            .Close
        End With

        With bk2
            .RefreshAll
            .Save
            .Close
        End With

        With wb
            .RefreshAll
            .Save
            .Close
        End With

    End Sub
0
источник

Попробуйте использовать Application.Wait Now+TimeSerial(<hours>,<minutes>,<seconds>). Работает для меня всякий раз, когда мне нужно задерживать выполнение кода.

0
источник

Посмотрите другие вопросы по меткам или Задайте вопрос