Подождите, пока ActiveWorkbook.RefreshAll закончит - VBA

У меня есть sub, который вызывает ActiveWorkbook.RefreshAll, чтобы вносить новые данные из источника XML, а затем выполняет несколько модификаций. Проблема в том, что для завершения команды RefreshAll недостаточно времени, поэтому следующие подсистемы и функции не выполняются правильно, что приводит к тому, что повторяющиеся строки не будут правильно стерты.

Я попытался использовать Application.Wait и функцию Сон, но они также приостанавливают процесс обновления. Я просто хочу, чтобы остальная часть кода дождалась завершения процесса обновления до выполнения остальной части кода.

Любые идеи о том, как это реализовать? Прямо сейчас я смог исправить это, не вызвав RefreshAll, что дает мне идею реализовать второй поток, который будет выполнен после этого, но это не является хорошим обходным путем.

Пожалуйста, дайте мне знать, если это не ясно. Благодаря

ИЗМЕНИТЬ Поэтому я попробовал несколько предложений из приведенных ниже сообщений, и именно это я смог придумать. Выполнение "макроса записи", а затем UNCHECKING "Включить обновление фона" в свойствах таблицы не привело ни к чему. После этого я тоже обновился. Это было результатом записанного макроса:

With ActiveWorkbook.Connections("XMLTable")
        .Name = "XMLTable"
        .Description = ""
End With
ActiveWorkbook.Connections("XMLTable").refresh

В классе ActiveWorkbook.Connections нет опции BackgroundQuery, чтобы я мог установить ее в False. Любые идеи?

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

EDIT2: После небольшого исследования я нашел эту страницу: http://www.mrexcel.com/forum/excel-questions/564959-execute-code-after-data-connection-refresh-finished.html Похоже, что тип соединения XML не имеет булева логика BackgroundQuery. Этот параметр доступен только для соединений ODBC и OLEDB, которые являются типами xlConnectionTypeODBC и xlConnectionTypeOLEDB, соответственно. Используемое мной соединение XML имеет тип xlConnectionTypeXMLMAP, который не имеет опции BackgroundQuery. Кто-нибудь знает, куда идти? Единственное решение, которое я имею в виду сейчас, - сделать две отдельные макро кнопки на листе excel, один для обновления и один для модификации данных, но я предпочел бы сохранить этот параметр до последнего.

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

Как прокомментировано:

'~~> your code here before refresh

Activeworkbook.RefreshAll
DoEvents

'~~> rest of your code here after refresh

То, что делает DoEvents, похоже на кратковременное разрешение Windows сделать перерыв с Macro для обработки всех ожидающих событий перед возвратом в макрос.
Поэтому, когда вы обновляете свою книгу и ставите DoEvents после этого, она не возобновляет макрос до тех пор, пока обновление не будет завершено.

+20
источник

У меня была одна и та же проблема, однако DoEvents не помог мне, так как мои подключения для передачи данных включали фоновое обновление. Вместо этого, используя Wayne G. Dunn, я отвечаю как точка перехода, я создал следующее решение, которое отлично подходит для меня;

Sub Refresh_All_Data_Connections()

    For Each objConnection In ThisWorkbook.Connections
        'Get current background-refresh value
        bBackground = objConnection.OLEDBConnection.BackgroundQuery

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

        'Refresh this connection
        objConnection.Refresh

        'Set background-refresh value back to original value
        objConnection.OLEDBConnection.BackgroundQuery = bBackground
    Next

    MsgBox "Finished refreshing all data connections"

End Sub

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

Кроме того, я предпочитаю ThisWorkbook ActiveWorkbook, поскольку я знаю, что он будет нацелен на книгу, где находится код, на случай изменения фокуса. Девять раз из десяти это не имеет значения, но мне нравится ошибаться на стороне осторожности.

РЕДАКТИРОВАТЬ: Просто посмотрел ваше изменение об использовании соединения xlConnectionTypeXMLMAP, у которого нет опции BackgroundQuery, извините. Я оставлю это для всех (например, я), ищущих способ обновить типы OLEDBConnection.

+47
источник
другие ответы

Связанные вопросы


Похожие вопросы

Хотя @Wayne G. Dunn дал в коде. Вот то место, где вы не хотите кодировать. И снимите флажок, чтобы отключить фоновое обновление.

enter image description here

+13
источник

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Сообщается, что приведенный ниже код вызвал некоторые сбои! Используйте с осторожностью.

в соответствии с ЭТОТ ответ в Excel 2010 и выше CalculateUntilAsyncQueriesDone останавливает макросы до тех пор, пока обновление не будет завершено
 ThisWorkbook.RefreshAll
 Application.CalculateUntilAsyncQueriesDone

+6
источник

Вы должны отключить "обновление фона" для всех запросов. Если обновление фона включено, Excel работает вперед, пока происходит обновление, и у вас есть проблемы.

Данные > Соединения > Свойствa > (снимите флажок) включить обновление фона

+4
источник

Вот решение, найденное в http://www.mrexcel.com/forum/excel-questions/510011-fails-activeworkbook-refreshall-backgroundquery-%3Dfalse.html:

Либо все свойства backgroundquery для элементов поворота заданы как False или циклически перемещаются по всем ключевым пунктам книги:

Code:
    For Each pc In ActiveWorkbook.PivotCaches
       pc.BackgroundQuery = False
       pc.Refresh
    Next 

это приведет к тому, что все свойства corequery будут отображаться как false. Вы можете сохранить все настройки:

код:

For Each pc In ActiveWorkbook.PivotCaches
  originalBGStatus = pc.BackgroundQuery
  pc.BackgroundQuery = False
  pc.Refresh
  pc.BackgroundQuery = originalBGStatus
Next
+1
источник

Это может быть не идеальным, но попробуйте использовать "Application.OnTime" , чтобы приостановить выполнение оставшегося кода до тех пор, пока не пройдет достаточно времени, чтобы гарантировать, что все процессы обновления завершены.

Что делать, если последняя таблица в вашем списке обновления была фальшивой таблицей, состоящей только из флага, указывающего, что обновление завершено? Эта таблица будет удалена в начале процедуры, а затем, используя "Application.OnTime" , Sub будет запускаться каждые 15 секунд или около того, чтобы проверить, была ли заполнена таблица faux. Если вы заполняете, прекратите проверку "Application.OnTime" и приступите к остальной части вашей процедуры.

Немного шаткий, но он должен работать.

+1
источник

Попробуйте выполнить:

ActiveSheet.Calculate

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

0
источник

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

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

Я понятия не имею, почему это решило проблему, но это сделало.

0
источник

Если вы не состоите в браке с использованием Excel Web Query, попробуйте вместо этого открыть URL-адрес в качестве отдельной книги. Переход по этому маршруту позволяет вам работать с результирующими данными после завершения веб-запроса, как если бы вы отключили "Включить обновление фона".

Хорошо, но Excel отображает индикатор выполнения во время запроса, вместо того, чтобы просто замораживать/показывать сообщение загрузки в ячейке назначения.

См. мой ответ на этот вопрос: Как я могу отправить данные из веб-запроса Excel после завершения запроса?

Компромисс между этим подходом заключается в том, что вам нужно управлять обработкой данных, которые вы возвращаете сами, - Excel не будет помещать их в данный пункт назначения для вас.

Мы закончили этот маршрут после того, как попробовали что-то очень похожее на то, что вы, похоже, делали.

0
источник

Это сработало для меня:

ActiveWorkbook.refreshall
ActiveWorkbook.Save

При сохранении рабочей книги необходимо выполнить обновление.

0
источник

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

With ActiveWorkbook.Connections("Query - DL_3").OLEDBConnection
    .BackgroundQuery = False
    End With
0
источник

Для Microsoft Query вы можете перейти в Connections → Properties и снять галочку "Включить фоновое обновление".

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

0
источник

Чтобы решить эту проблему, я сохранил книгу. Это заставляет его обновить перед закрытием.

Тот же подход работает для копирования многих формул перед выполнением следующей операции.

-1
источник

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