Код для выполнения, когда ActiveWorkbook.Connections ("x"). Обновление завершено - PullRequest
1 голос
/ 12 мая 2011

выбор данных из внешнего источника
У меня есть подключение для передачи данных, которое получает данные с помощью запроса select с SQL-сервера в лист Excel с использованием кода vba, например:

With ActiveWorkbook.Connections("x"). _
    OLEDBConnection
    .BackgroundQuery = True
    .CommandText = Array( _
    "SELECT ... FROM ...
...
ActiveWorkbook.Connections("x").Refresh

необходимо также обновить связанную сводную таблицу с импортированными данными
Однако, насколько я могу судить, ActiveWorkbook.Connections("x").Refresh работает асинхронно, и я хочу выполнить код, который выполняется после завершения обновления, чтобы я мог запустить этот код:

Private Sub UpdatePivot()
Dim PV As PivotItem

  For Each PV In ActiveSheet.PivotTables("PT1").PivotFields("PN").PivotItems
    If PV.Name <> "(blank)" Then
      PV.Visible = True
    Else
      PV.Visible = False
    End If
  Next
End Sub

, но только когда данные читаются в
Как узнать, когда обновление завершено с получением всех данных?
Что нужно сделать, чтобы запустить подпрограмму UpdatePivot только после завершения обновления, не прибегая к sleep взломам.

PS Иногда запрос выполняется быстро (<1 сек),иногда это медленно (> 30 секунд) в зависимости от точных данных, которые я выбираю, что является динамическим.

Ответы [ 2 ]

2 голосов
/ 12 мая 2011

Это не блестящее решение, но вы можете заставить ActiveWorkbook.Connections("x").Refresh работать синхронно, установив

.BackgroundQuery = False

Еще одним более сложным решением будет опрос состояния соединения путем проверки * 1006.* свойство внутри конструкции цикла.

1 голос
/ 16 июля 2012

.BackgroundQuery = False НЕ обеспечит синхронное выполнение после обновления данных.

Попробуйте сами, создав простой запрос, и в подпрограмму Worksheet_Change добавьте код для выбора нескольких ячеек.Мне часто удается запустить две команды до появления круга ожидания / тайм-аута.

Таким образом, я не могу определить, вернул ли запрос правильные данные.Я попытался установить в ячейке ссылки значение столбца с серединой запроса и проверил, что они равны - к сожалению, событие Worksheet_Change FIRES ДВАЖДЫ ПО ОБНОВЛЕНИЮ ДАННЫХ!

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

...