Таблицы запросов на питание не будут загружать данные до тех пор, пока VBA не завершит выполнение

У меня есть электронная таблица с 4 рабочими листами, каждая из которых подключена к силовому запросу, который подключается к базе данных OLEDB и запускает выбор для импорта данных в книгу.

Я пытаюсь автоматизировать обновление запросов.

У меня есть VBA в книге, которая
- отключает обновление фона,
- запускает Workbook.RefreshAll,
- сбрасывает фоновое обновление до значения true (так как мне это нужно, чтобы программное обеспечение автоматизации могло запускать его в первую очередь) и
- затем ждет 30 секунд, чтобы дать программе автоматизации некоторое время, прежде чем она начнет сохранять книгу.

Все программное обеспечение выполняет вызов макроса в рабочей книге, а затем сохраняет следующее выполнение.

Запросы корректно выполняются один за другим, и я могу сказать, что данные в таблицах обновились.

Подтверждение запроса питания, которое загрузили строки, происходит после завершения выполнения VBA, поэтому программное обеспечение автоматизации сохраняет его до того, как это будет сделано, и Excel сообщит, что загрузка была неудачной. Это не проблема, когда все работает, но мы не узнаем, когда загрузка действительно потерпела неудачу, если я не добавлю какое-то сравнение количества строк, которое действительно является обходным решением, а не фактическим решением.

Я попытался создать два подкаталога в книге, один для обновления, а затем другой, который вызывает первый подпрограмм, а затем ждет 30 секунд, я надеялся, что загрузка завершится после того, как будет выполнена первая завершающая операция, но этого не произойдет. Я попытался обновить одно соединение за раз, вместо использования RefreshAll, попробовал обновить фактические таблицы запросов питания вместо соединений и попытался обновить фоновый запрос, установленный в true, а затем цикл, пока обновление не будет отмечено как полное (что работает, если вы шаг за шагом, но сбой, если вы просто запустите VBA в полном объеме).

Я также попытался сохранить таблицу в конце VBA, но она все еще ждет завершения сохранения, чтобы обновить статус запроса мощности.

Мой последний VBA:

Sub Workbook_RefreshAll()

Application.DisplayAlerts = False

For Each objConnection In ThisWorkbook.Connections

    'Temporarily disable background-refresh
    objConnection.OLEDBConnection.BackgroundQuery = False
    objConnection.OLEDBConnection.MaintainConnection = False

Next

ActiveWorkbook.RefreshAll

For Each objConnection In ThisWorkbook.Connections

    'Re-enable background-refresh
    objConnection.OLEDBConnection.BackgroundQuery = True
    objConnection.OLEDBConnection.MaintainConnection = True

Next

newHour = Hour(Now())
newMinute = Minute(Now())
newSecond = Second(Now()) + 30
waitTime = TimeSerial(newHour, newMinute, newSecond)

Application.Wait waitTime

End Sub

(Я не могу вспомнить, действительно ли поддерживающий параметр подключения помог, поскольку я пытаюсь заставить соединение упасть после каждого обновления, но он работает, поэтому не принял его.)

+1
источник поделиться
1 ответ

Вместо Application.Wait попробуйте следующее:

Do until now() >= waittime
    DoEvents
Loop
+1
источник

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