Страницы: 1
RSS
Обновление данных из web-запроса
 
Доброго времени суток, имеется такая проблема:
Есть небольшой макрос
Код
Application.ScreenUpdating = False
Sheets("лист2").Visible = True
    Sheets("Лист2").Range("G6").Select
    Selection.ListObject.QueryTable.Refresh BackgroundQuery:=False
Sheets("Лист1").Select
Sheets("Лист2").Visible = False
Application.ScreenUpdating = True
Суть данного макроса в том чтобы показать скрытый лист, на котором находится таблица с данными из web запроса, обновить их и скрыть данный лист, оставшись на листе1

Если выполнять макрос из редактора по F8 (шаг за шагом) то все проходит гладко, если же выполнять нажатием "старт" то после этапа обновления запроса что то идет не так...

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

Вобщем задача:
1. отобразить скрытый лист
2. обновить данные в таблице (путем web запроса) или другим способом (данные находятся в таблице на сайте)
3. скрыть этот лист
4. продолжить работу макроса

MS Excel 2016 , может в нем беда?
 
wlad1164, обращайтесь к объекту напрямую, без всяких select и visible.

Работает и со скрытым листом:
Код
Sub Test()
    Sheets("Лист2").ListObjects(1).QueryTable.Refresh BackgroundQuery:=False
End Sub
Либо так:
Код
Sheets("Лист2").Range("A1").ListObject.QueryTable.Refresh BackgroundQuery:=False
Если уж совсем влезать в SQL запросы, например выборка по фамилии, то так:
Код
Sub GetData()
    Set QT = Sheets("Лист2").ListObjects(1).QueryTable
    With QT
        .CommandType = xlCmdSql
        .CommandText = "SELECT * FROM [Table 0] WHERE [Фамилия]='Иванов И.И.'"
        .Refresh BackgroundQuery:=False
    End With
End Sub
 
ЕМНИП, дождаться окончания выполнения запроса можно, поставив после вызова обновления строку
Код
Do Events
F1 творит чудеса
 
Цитата
Jungl написал:
обращайтесь к объекту напрямую, без всяких select и visible.
Спасибо, я всего лишь учусь, поэтому все делаю по подобию записи с макрекодера (или как его там)
Цитата
Максим Зеленский написал:
поставив после вызова обновления строку
Спасибо, буду побывать=)
 
Jungl, если так
Код
Sub Test()
    Sheets("Лист2").ListObjects(1).QueryTable.Refresh BackgroundQuery:=False
    Sheets("Лист1").Select
End Sub
макрос запускаю кнопкой "прямоугольник" расположенной на "лист1" после выполнения макроса, активным остается "лист2"
если же "лист2"  был изначально скрыт, то после выполнения макроса активный лист не выбирается (точнее ни один из листов не активен, в смысле не выбран)

с функцией
Код
Do Events 
никаких изменений не наблюдается...
Изменено: wlad1164 - 28.08.2017 23:30:26
 
Цитата
wlad1164 написал:
Sheets("Лист1").Select
Зачем?
Если вы хотите что-то получить из листа2 на лист1, используйте целевые ячейки/диапазоны.
Например:
Код
Sheets("Лист1").Range("A1").Value = Sheets("Лист2").Range("A1").Value
И не нужно листы выбирать.


Цитата
wlad1164 написал:
точнее ни один из листов не активен, в смысле не выбран
Не верю, проверьте:
Код
MsgBox "Активный лист """ & ActiveSheet.Name & """"
 
Цитата
Jungl написал:
Зачем?
Затем чтобы после выполнения макроса остаться на Лист1

Цитата
Jungl написал:
Не верю, проверьте:
Проверил, результат примерно таков:
1.Отображается(выбран) "лист1" с кнопкой к которой привязан макрос, лист2 не скрыт
2.жму кнопку
3.выполняется макрос, данные обновляются
4.появляется сообщение от MsgBox "активный лист лист1"
5.жму "ОК"
6.закрывается окно MsgBox  и активным выбирается Лист 2

Второй случай, результат примерно таков:
1.Отображается (выбран) "лист1" с кнопкой к которой привязан макрос, лист2 скрыт
2.жму кнопку
3.выполняется макрос, данные обновляются
4.появляется сообщение от MsgBox "активный лист лист1"
5.жму "ОК"
6.закрывается окно MsgBox  и ни один из листов не выбран (не активен)
7. на мониторе наблюдается  примерно такое:
Скрытый текст
выделение соответствует размеру таблицы на "лист2"
сама сетка и содержимое соответствует тому листу, с которого запускали макрос

Сами же вкладки листов НЕ активны (все из видимых)
Скрытый текст
 
Небольшое дополнение, отображается тот лист с которого был запущен макрос, а EXCEL работает с ним как буд-то выбран скрытый лист
и собственно GIF-ка в доказательство
ссылка на GIF т.к. прикрепить к сообщению нельзя

И если не переходя из этого "чудо-листа" выполнить
Код
MsgBox "Активный лист """ & ActiveSheet.Name & """" 
Выведет сообщение что активен лист2, хотя лист2 скрыт!
и уже по нажатию "ок" перебрасывает на видимый лист который справа от "лист 2"

Даже если ВРУЧНУЮ нажать "Обновить все" то происходит то же самое, полагая дело не в макросе, а в самом Excel
Изменено: wlad1164 - 29.08.2017 18:36:25
 
Попробуйте после .Refresh добавить такие 2 строчки кода:
Application.CalculateUntilAsyncQueriesDone
Application.ScreenUpdating = True
 
Цитата
ZVI написал:
после .Refresh добавить такие 2 строчки кода
Без изменений, все по-прежнему
Код
    Sheets("лист2").ListObjects(1).QueryTable.Refresh
    Application.CalculateUntilAsyncQueriesDone
    Application.ScreenUpdating = True 
Начинаю косо смотреть на win10+office2016 , завтра по пробую на других версиях...
Изменено: wlad1164 - 29.08.2017 21:51:23
 
Цитата
wlad1164 написал:
и собственно GIF-ка в доказательство
теперь я вас понял, не сталкивался с таким ранее.
есть такой вариант. используется получение внешних данных "Из интернета". Данные поступают на Лист3 и формулами подтягиваются на Лист1.
Изменено: Jungl - 29.08.2017 22:42:49
 
Цитата
Jungl написал:
есть такой вариант. используется получение внешних данных "Из интернета".
Тоже перешел к такому варианту, жаль что данные полученные таким образом нельзя напрямую заносить в "умную" таблицу, но что поделать)
Страницы: 1
Читают тему
Наверх