Excel vba обновить ожидание - PullRequest
       53

Excel vba обновить ожидание

17 голосов
/ 19 января 2012

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

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

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

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

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

Редактировать:

Простой код:

ActiveWorkbook.RefreshAll

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

MsgBox("The Refreshing is Completed!")

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

Ответы [ 9 ]

9 голосов
/ 19 января 2012

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

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

Редактировать:

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

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>
7 голосов
/ 06 ноября 2014

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

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

ThisWorkbook.RefreshAll
Application.CalculateUntilAsyncQueriesDone

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

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

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

7 голосов
/ 12 октября 2012

У меня только что была похожая проблема, и мы решили ее следующим образом:

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

ActiveWorkbook.RefreshAll

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

1 голос
/ 24 мая 2017

Снимите флажок « Включить фоновое обновление » в Данные -> Соединение -> Свойства

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

enter image description here

0 голосов
/ 27 ноября 2018

Попробуйте этот подход:

With Selection.ListObject.QueryTable
  .BackgroundQuery = False
  .Refresh
End With

Когда вы говорите это следующим образом, BackgroundQuery = False, похоже, не меняет свойство BackgroundQuery на False.

Selection.ListObject.QueryTable.Refresh BackgroundQuery = False  ' doesn't work
0 голосов
/ 15 февраля 2016
ActiveWorkbook.RefreshAll
        Do While Application.CalculationState <> xlDone
            DoEvents
        Loop

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

0 голосов
/ 06 октября 2015

Другой способ - использовать команду Workbooks.Open, чтобы вместо этого загрузить URL-адрес в виде отдельной рабочей книги.

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

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

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

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

0 голосов
/ 11 августа 2014

'От A.G.Johnson@Live.com 2014-08-11 «Вот простая версия, которая позволит вам полный контроль. 'Вместо использования RefreshAll создайте следующую подпрограмму: Вызовите подпрограмму из вашего Excl VBA, где бы вы ни хотели ее выполнить, и ничего больше не происходит, пока это не будет сделано. «Еще одним преимуществом является то, что он не обновляет любые сводные таблицы, поэтому они не мешают, 'и если у вас есть сводные объекты, основанные на обновленных данных, вы можете запустить аналогичное обновление 'для ваших опорных точек после завершения обновления запроса.

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
0 голосов
/ 20 февраля 2013

Если вы хотите, чтобы ваш скрипт ожидал в vba, вы должны использовать sleep. Но сон иногда не работает в 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
...