Ожидание завершения запроса, прежде чем продолжить - PullRequest
0 голосов
/ 27 апреля 2018

У меня есть это в ThisWorkbook.

Private Sub Workbook_Open()
    Workbooks(ThisWorkbook.Name).RefreshAll
End Sub

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

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

Sub Move_data()
    Dim rng1, rng2, rng3 As Range
    Set rng1 = Worksheets("Sheet1").Range("A3:F103")
    rng1.Value = Worksheets("Sheet2").Range("A11:F111").Value

    'etc for rng2 and rng3... 
End Sub

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

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

Также есть способ ускорить обновление запросов. Я попробовал это:

Application.ScreenUpdating = False

Но запрос / таблицы / графики все еще мигают / обновляются. Я полагаю, что это связано со свойствами Power Query, и предполагаю, что мне нужно написать что-то еще.

Ответы [ 2 ]

0 голосов
/ 27 апреля 2019

Предполагая, что у вас есть таблица, начинающаяся с ячейки A1.

Это решение очищает содержимое ячейки A1 и использует обновление для повторного заполнения.

Цикл Do-While проверяет содержимое ячейки A1 и ожидает ее заполнения.

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

Dim counter As Long
Dim maxcount As Long
Dim ws As Worksheet
maxcount = 10000
Set ws = ThisWorkbook.Sheets(1)
ws.Activate
' some code
ws.Cells(1,1).Clear
DoEvents

' Refresh statement
ws.ListObjects(1).Refresh

' Wait for refresh or timer to expire
Do While ws.Cells(1,1).value = ""
  Application.Wait(100)
  counter = counter + 100
  If counter >= maxcount then
    MsgBox "Refresh failed"
    End
  End If
Loop
DoEvents
0 голосов
/ 27 апреля 2018

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

  • Перейти к ленте: [Данные]
  • Нажмите [Подключения]
  • Выберите запрос, на который вы хотите повлиять
  • Нажмите [Свойства]
  • Снимите флажок [Включить фоновое обновление]

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...