В файле используется WEB запрос (таблица котировок с биржи) с сохранением результатов на отдельном листе (Лист2). С помощью макроса нажатием на кнопку происходит обновление данных. При этом для удобства отображение форматированной таблицы с нужными столбцами на Листе1. Проблема заключается в том, что хоть команда на обновление данных идёт впервую очередь, но почему-то копирование необходимых ячеек происходит раньше и в итоговой таблице получаем устаревшие данные. Как можно изменить чтобы в итоговую таблицу копировались актуальные данные? Спасибо
В файле используется WEB запрос (таблица котировок с биржи) с сохранением результатов на отдельном листе (Лист2). С помощью макроса нажатием на кнопку происходит обновление данных. При этом для удобства отображение форматированной таблицы с нужными столбцами на Листе1. Проблема заключается в том, что хоть команда на обновление данных идёт впервую очередь, но почему-то копирование необходимых ячеек происходит раньше и в итоговой таблице получаем устаревшие данные. Как можно изменить чтобы в итоговую таблицу копировались актуальные данные? Спасибоbazhalex
1 вариант решения: отключить фоновое обновление подключения 2 вариант использовать модуль класса добавить модуль класса Class1 с кодом [vba]
Код
Option Explicit Public Refreshed As Boolean Private WithEvents qt As Excel.QueryTable Public Property Set QryTbl(ByVal QryTbl As QueryTable): Set qt = QryTbl: End Property Private Sub qt_BeforeRefresh(Cancel As Boolean) Refreshed = False End Sub Private Sub qt_AfterRefresh(ByVal Success As Boolean) Refreshed = True End Sub
[/vba]
[vba]
Код
ActiveWorkbook.RefreshAll
[/vba] заменить на [vba]
Код
Dim QtClass As Class1: Set QtClass = New Class1 Set QtClass.QryTbl = Sheets("data").QueryTables("market_1") Sheets("data").QueryTables("market_1").Refresh Do Until QtClass.Refreshed: DoEvents: Loop
[/vba]
1 вариант решения: отключить фоновое обновление подключения 2 вариант использовать модуль класса добавить модуль класса Class1 с кодом [vba]
Код
Option Explicit Public Refreshed As Boolean Private WithEvents qt As Excel.QueryTable Public Property Set QryTbl(ByVal QryTbl As QueryTable): Set qt = QryTbl: End Property Private Sub qt_BeforeRefresh(Cancel As Boolean) Refreshed = False End Sub Private Sub qt_AfterRefresh(ByVal Success As Boolean) Refreshed = True End Sub
[/vba]
[vba]
Код
ActiveWorkbook.RefreshAll
[/vba] заменить на [vba]
Код
Dim QtClass As Class1: Set QtClass = New Class1 Set QtClass.QryTbl = Sheets("data").QueryTables("market_1") Sheets("data").QueryTables("market_1").Refresh Do Until QtClass.Refreshed: DoEvents: Loop
заменить на Dim QtClass As Сlass1: Set QtClass = New Сlass1 Set QtClass.QryTbl = Sheets("data").QueryTables("market_1") Sheets("data").QueryTables("market_1").Refresh Do Until classQtEvents.Refreshed: DoEvents: Loop
Всё сделал, ругается на QryTbl = "Compile Error - Method or data member not found"
Правда пока пробывал на 2003...
По первому пункту всё заработало как надо. Спасибо.
заменить на Dim QtClass As Сlass1: Set QtClass = New Сlass1 Set QtClass.QryTbl = Sheets("data").QueryTables("market_1") Sheets("data").QueryTables("market_1").Refresh Do Until classQtEvents.Refreshed: DoEvents: Loop
Всё сделал, ругается на QryTbl = "Compile Error - Method or data member not found"
Правда пока пробывал на 2003...
По первому пункту всё заработало как надо. Спасибо.bazhalex
krosav4ig, а зачем весь этот "огород", с хуком на события QueryTable в классе? Если только для синхронизации метода [QueryTable].Refresh, то можно было просто вот так: [vba]
krosav4ig, а зачем весь этот "огород", с хуком на события QueryTable в классе? Если только для синхронизации метода [QueryTable].Refresh, то можно было просто вот так: [vba]