Ожидание обновления Excel vba

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

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

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

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

Как я могу это сделать?

Edit:

Простой код:

ActiveWorkbook.RefreshAll

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

MsgBox("The Refreshing is Completed!")

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

Ответы

Ответ 1

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

Посмотрите на нижнюю часть этой страницы: http://www.mrexcel.com/tip103.shtml для изображений

Edit:

Вот два макроса, которые показывают желаемый эффект:

Sub AddWebquery()
    With ActiveSheet.QueryTables.Add(Connection:= _
        "URL;http://de.selfhtml.org/html/tabellen/anzeige/table_tr_th_td.htm", _
        Destination:=Range("$A$1"))
        .Name = "table_tr_th_td"
        .BackgroundQuery = False
        .RefreshStyle = xlInsertDeleteCells
        .WebSelectionType = xlSpecifiedTables
        .WebFormatting = xlWebFormattingNone
        .WebTables = "1"
        .Refresh BackgroundQuery:=False
    End With
End Sub

Sub TestRefreshing()
    Range("A1").Clear
    ActiveWorkbook.RefreshAll
    Debug.Print "Test: " & Range("A1").Value
End Sub

Выполните AddWebquery, чтобы добавить запрос, затем выполните TestRefreshing для проверки эффекта. Вы можете изменить строку .BackgroundQuery = False на True, чтобы получить неправильный результат.

Тестирование с 10-секундным сном:

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>SO-Test</title>
    </head>
    <body>
        <?php
        sleep(10);
        ?>
        <table border="1">
            <thead>
                <tr><th>1</th></tr>
            </thead>
            <tbody>
                <tr><td>2</td></tr>
            </tbody>
        </table>
    </body>
</html>

Ответ 2

Я работал с моделью PowerPivot, и я хотел обновить данные, прежде чем сохранить и закрыть модель. Тем не менее, excel только что закрыл модель до завершения обновления, и модель возобновила обновление при открытии.

Добавив следующую строку сразу после метода RefreshAll, сделал трюк:

ThisWorkbook.RefreshAll
Application.CalculateUntilAsyncQueriesDone

Я надеюсь, что это сработает и для вас.

Убедитесь, что вы отключили события, чтобы ускорить процесс.

Обратите внимание, что я использую Excel 2010, я не уверен, доступен ли этот метод в более старых версиях.

Ответ 3

У меня была аналогичная проблема, и мы решили ее следующим образом:

For i = 1 To ActiveWorkbook.Connections.Count
    ActiveWorkbook.Connections(i).OLEDBConnection.BackgroundQuery = False
    'MsgBox ActiveWorkbook.Connections(i).OLEDBConnection.BackgroundQuery
Next

ActiveWorkbook.RefreshAll

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

Ответ 4

Снимите флажок "Включить фоновое обновление" в Данные → Соединение → Свойства

Это отключит обновление в фоновом режиме и дождитесь завершения обновления.

введите описание изображения здесь

Ответ 5

'От [email protected] 2014-08-11 "Вот простая версия, которая позволит вам полностью контролировать. 'Вместо использования RefreshAll создайте следующую подпрограмму: "Вызовите процедуру из своего Excl VBA, где бы вы ее не выполнили, 'и ничего не происходит до тех пор, пока это не будет сделано. "Еще одно преимущество заключается в том, что он не обновляет таблицы Pivot, поэтому они не мешают, ', и если у вас есть опорные точки, которые полагаются на обновленные данные, вы можете запустить аналогичное обновление 'для ваших опорных точек после завершения обновления запроса.

sub RefreshQueries()
    dim ws as worksheet
    dim qt as QueryTable
    For each ws in thisworkbook.worksheets
        For each qt in ws.querytables
            qt.refresh
        next qt
    next ws
end sub

Ответ 6

Еще один способ - использовать команду Workbooks.Open для загрузки URL-адреса в виде отдельной книги.

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

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

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

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

Ответ 7

ActiveWorkbook.RefreshAll
        Do While Application.CalculationState <> xlDone
            DoEvents
        Loop

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

Ответ 8

Если вы хотите, чтобы ваш script ждал в vba, вам нужно использовать сон. Но сон иногда не работает в Excel vba.

http://99students.com/macro-sleep-vba/

Вместо этого попробуйте с

Application.Wait (Now + TimeValue("0:01:00"))

Пример кода

Sub Setting_Sleep_Without_Sleep_Function()
 MsgBox Now
 Application.Wait DateAdd("s", 10, Now)
 MsgBox Now
End Sub