Есть некий сайт, с которого необходимо периодически «выдергивать таблицу», сам запрос я сделал через «Данные»-«Получить внешние данные из вэба», но дело в том, что сайт выдает не более 30 позиций на страницу, а потом необходимо сменить страницу, при этом запрос изменится с index.php?action_mlist_sort_registered_start_0_desc на index.php?action_mlist_sort_registered_start_30_desc потом index.php?action_mlist_sort_registered_start_60_desc и так далее… как можно выдернуть всю таблицу? вручную не вариант все запросы делать, т.к. таблица постоянно увеличивается и на сегодня там уже 1792 страницы по 30 записей…
ну если нет возможности получить все данные одним махом, то макросом менять в цикле строку запроса (Сonnection), только вот не понятно как определить последнюю страницу.
На самом сайте есть информация какая страница последняя, как вариант можно сначала в браузере открывать эту страницу, смотреть какая страница на текущий момент последняя, вручную вносить это число в ячейку документа и потом запускать макрос с циклом от 0 до этой страницы. А вот как сам запрос прописать в макрос? макрорекордером что-то ужасное получилось: (имя сайта я специально изменил)
edkudin написал: можно сначала в браузере открывать эту страницу,
а потом, как вариант, руками скопировать нужные данные... и все готово!
никто Вам не подскажет как взять данные с некоего сайта, пока не узнает адрес этого некоего сайта, не поймет как оттуда взять нужные данные руками и только после этого сможет написать макрос, который сможет делать это автоматически
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
Увы но дать такую информацию я не могу, сайт узкоспецифичный, вход по логин\пароль и передавать его я не имею права. Вы лучше помогите советом в сторону каких команд мне смотреть и как мне пусть даже такой дурацкий запрос как выше "засунуть в цикл", что-бы каждый последующий запрос добавлял данные к таблице на листе а не затирал их.
Сделали Query руками на промежуточном листе, можно и макросом, это на любителя, я сторонник меньше кода, больше встроенных инструментов. QueryTables.BackgroundQuery=False - запретили фоновой обновление. это можно делать и прямо в интерфейсе. Если можно посмтреть количество листов то QueryTables.connection = URL где это количество QueryTables.Refresh - перезапросили информацию Посмотрели в нужной ячейке это количество и цикл QueryTables.connection - менять в цикле "index.php?action_mlist_sort_registered_start_0_desc" на то что нужно QueryTables.Refresh - перезапросили информацию далее скпировали то что получили QueryTables.ResultRange в итоговый лист и повторили цикл иначе никак. можно наверно пошаманить с Destination, но стоит ли?
Спасибо, я сейчас как раз"с циклами играюсь", вопрос а как можно в макросе циклически с step=30 менять числовое значение в строке index.php?action_mlist_sort_registered_start_0_desc на index.php?action_mlist_sort_registered_start_30_desc потом index.php?action_mlist_sort_registered_start_60_desc и так далее
QueryTables.Add(Connection:= _
"URL;http://www.qqq.qq/SMF/index.php?action=mlist;sort=registered;start=" & i & ";desc" _
, Destination:=Range("$A$1"))
Тут получится что каждый раз добавляем Еще один новый запрос, что плохо. Как уже писал, лучше до цикла создать запрос а в цикле менять Connection типа так,
Код
QueryTables(1).Connection= _
"URL;http://www.qqq.qq/SMF/index.php?action=mlist;sort=registered;start=" & i & ";desc"
Запрос сделал, не могу понять почему если раскомментировать запрет обновления экрана то таблица остается пустой, а с "апострофами" всё работает как надо.
Код
Sub запрос()
'Application.ScreenUpdating = False
Dim j As Integer, i As Integer
i = Range("C1")
For j = 0 To i Step 30
With ActiveSheet.QueryTables.Add(Connection:="URL;http://www.qqq.qq/SMF/index.php?action=mlist;sort=registered;start=" & j & ";desc", Destination:=Cells(2, 1))
.Name = ""
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.WebSelectionType = xlSpecifiedTables
.WebFormatting = xlWebFormattingNone
.WebTables = "3"
.WebPreFormattedTextToColumns = True
.WebConsecutiveDelimitersAsOne = True
.WebSingleBlockTextImport = False
.WebDisableDateRecognition = False
.WebDisableRedirections = False
.Refresh BackgroundQuery:=False
End With
Sheets("Лист1").Select: Range("A3:K32").Select: Selection.Copy: Sheets("Лист2").Select
endLastRow = Columns("B:K").Find(What:="*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
Range(Cells(endLastRow + 1, 1), Cells(endLastRow + 1, 4)).Select: ActiveSheet.Paste
Sheets("Лист1").Select
Rows("2:32").Select
Selection.QueryTable.Delete
Selection.ClearContents
Range("A2").Select
Next j
'Application.ScreenUpdating = True
End Sub
edkudin, был бы полноценный пример, можно б было посмотреть и даже автоматезировать извлечение этого количества страниц, а так, при условии отсутствия доступа к ресурсу …...
вопрос решился, правда когда 1700 страниц тянул я успел пива с рыбкой "упиться" но данные вытянул, удалил параметр "desc"" в "php?action=mlist;sort=registered;start=0;desc"" и теперь сортировка таблицы идет не с "конца в начало" а с "начала в конец" и теперь нужно будет просто периодически выдергивать 1-2 последние странички и смотреть что изменилось, а само "тело" остаётся без изменений. Всем спасибо!