Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.11.2010, 07:46   #1
Anna1
 
Аватар для Anna1
 
Регистрация: 30.11.2010
Сообщений: 6
По умолчанию Использование вэб-запроса для списка ссылок

Всем доброе время суток! В общем, я не очень опытный пользователь ВБА со стажем 1 день и отголосками занятий по информатике экономического вуза)
Решаю такую задачу (я, кажется, видела здесь подобные, но не смогла их применить к своему случаю(():
1.Есть лист эксель, на котором представлен столбец из 300 ссылок.
2.Для каждой из этой ссылки нужно создать веб-запрос и результаты выгрузить на этот же (можно на другой лист.)
3.Я чувствую, что здесь необходим цикл! но.. как?!
4. Я записала рекордером процедуру создания вэб-запроса для произвольной ссылки:

[HTML]Макрос4 Макрос
' Макрос записан 29.11.2010
'

'
Код HTML:
Range("A78:B78").Select
    Selection.Hyperlinks(1).Follow NewWindow:=False, AddHistory:=True
    Range("F80").Select
    With ActiveSheet.QueryTables.Add(Connection:= _
        "URL;http://www.ra-national.ru/?page=p-49698a2d", Destination:=Range("F80"))
        .Name = "?page=p-49698a2d"
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .BackgroundQuery = True
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .WebSelectionType = xlAllTables
        .WebFormatting = xlWebFormattingNone
        .WebPreFormattedTextToColumns = True
        .WebConsecutiveDelimitersAsOne = True
        .WebSingleBlockTextImport = False
        .WebDisableDateRecognition = False
        .Refresh BackgroundQuery:=False
    End With
End Sub[/HTML
]


Мне кажется, что нужно создать либо второй макрос, который будет "гонять" первый нужное количество раз, пока не закончатся строки в столбце со ссылками, но не знаю, как это оформить.
Еще не знаю, как вставлять в веб-запрос данные из ячейки. Возможно, необходимо ввести переменную, которая будет присваивать себе значения ячеек со ссылками, она-то и должна меняться в запросе. НО воплотить эти идеи я не в состоянии одна(((

А! еще у меня Excel 2000, и это фатальная данность.
Очень буду рада любому отзыву!
Всем хорошего дня
Вложения
Тип файла: rar Задачка.rar (22.2 Кб, 15 просмотров)
Anna1 вне форума Ответить с цитированием
Старый 30.11.2010, 08:41   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Посмотрите пример подобного макроса здесь: http://excelvba.ru/MoviesSearch

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

Покажите на своём файле, какие данные присутствуют изначально (к примеру, первые 2 столбца),
и что должно получиться в результате (один или несколько листов с результатами веб-запросов)

Последний раз редактировалось EducatedFool; 30.11.2010 в 08:59.
EducatedFool вне форума Ответить с цитированием
Старый 30.11.2010, 09:36   #3
Anna1
 
Аватар для Anna1
 
Регистрация: 30.11.2010
Сообщений: 6
По умолчанию Как я вижу результаты

Спасибо за быстрый ответ!

Я в Ваш макрос попыталась вникнуть. Пока, кажется, он мне не по зубам(
Только, если не ошибаюсь, там ссылки являются результатом поиска, а не входными данными???
Попробую.

Так. В идеале в результате каждого вэб-запроса на лист эксель должна копироваться таблица с указанием №, Названия компании, и др. параметрами, которые в ней присутствуют.

После каждого импорта данных на лист должен осуществляться следующий запрос, пока не закончатся ссылки.

Таким образом, в результате я хочу получить ряд таблиц, каждая из которых формируется запросом по ссылке.
Так как ссылок 286 штук, соответственно, получим 286 таблиц, в каждой из которых 4 столбца (не обязательно 4)

Тут я вижу две сложности:
1. Как переходить на другой лист, если в нем закончатся столбцы, а там их немного (а они закончатся!)
2. Что именно импортировать:
А. Всю страницу
Б. Нужную мне таблицу.
Вторая сложность возникает в связи с тем, что документы, выкладываемые по ссылкам, созданы в разное время (с 2001 года), и номера таблиц (а этот параметр используется при создании веб-запроса) в разное вермя - разные!
Поэтому нельзя в макросе зафиксировать: импортировать данные из таких-то таблиц.(((


Я сейчас специально сделала два запроса по произвольным ссылкам, в прикрепленном файле показан минимально желаемый результат )
Вложения
Тип файла: rar Задачка1.rar (34.5 Кб, 16 просмотров)
Anna1 вне форума Ответить с цитированием
Старый 30.11.2010, 09:51   #4
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
Я в Ваш макрос попыталась вникнуть. Пока, кажется, он мне не по зубам(
Я сам уже с трудом понимаю, как он работает)

Цитата:
Только, если не ошибаюсь, там ссылки являются результатом поиска, а не входными данными???
Там они являются промежуточным результатом.
Название фильма -> ссылка на фильм -> веб-запрос по этой ссылке

Цитата:
Тут я вижу две сложности:
1. Как переходить на другой лист, если в нем закончатся столбцы, а там их немного (а они закончатся!)
Перейти на другой лист - в принципе, не проблема.
Но... что вы потом будете делать с этими таблицами?
Если их вставлять так, как в вашем примере (одну правее другой), с ними же потом крайне неудобно будет работать
(ни формулы не применить, ни сводную таблицу не сформировать)

Может, всё-таки, каждую таблицу - на свой лист?
Или размещать таблицы одну под другой? (убирая заголовки, и возможно, добавляя дополнительные столбцы)


Цитата:
Вторая сложность возникает в связи с тем, что документы, выкладываемые по ссылкам, созданы в разное время (с 2001 года), и номера таблиц (а этот параметр используется при создании веб-запроса) в разное вермя - разные!
Это очень плохо - ибо заметно усложнит макрос (попутно увеличив время его выполнения)

Цитата:
получим 286 таблиц, в каждой из которых 4 столбца (не обязательно 4)
четырёх первых столбцов достаточно?
остальные столбцы можно отбрасывать? (или они нужны)
EducatedFool вне форума Ответить с цитированием
Старый 30.11.2010, 10:19   #5
Anna1
 
Аватар для Anna1
 
Регистрация: 30.11.2010
Сообщений: 6
По умолчанию

Цитата:
Перейти на другой лист - в принципе, не проблема.
Но... что вы потом будете делать с этими таблицами?
Если их вставлять так, как в вашем примере (одну правее другой), с ними же потом крайне неудобно будет работать
(ни формулы не применить, ни сводную таблицу не сформировать)
Да, тут Вы правы. Тогда удобнее размещать одну под другой таблицей. Только тут важно указать период. (Его можно взять с того же листа.В исходном файле "Задача" каждой ссылке соответствует ячейка с номером квартала (столбец А))

----
Я просмотрела ссылки. Там везде четыре столбца. Это все,что входит в табличку.


Цитата:
Это очень плохо - ибо заметно усложнит макрос (попутно увеличив время его выполнения)
Что касается номера таблиц - нужно анализировать ссылки. Я думаю, там за определенный год (или за период) - номера могут повторяться.
Anna1 вне форума Ответить с цитированием
Старый 30.11.2010, 11:23   #6
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Вот что у меня получилось:



Безусловно, макрос требует множества доработок, - но, в целом, основные моменты уже реализованы.
Проверяйте.
EducatedFool вне форума Ответить с цитированием
Старый 30.11.2010, 11:51   #7
Anna1
 
Аватар для Anna1
 
Регистрация: 30.11.2010
Сообщений: 6
По умолчанию

Ничего себе!Вот это да...) Я и не думала, что такое возможно за столь маленький срок..
Пытаюсь разобраться с кодом сейчас..
Anna1 вне форума Ответить с цитированием
Старый 30.11.2010, 13:19   #8
Anna1
 
Аватар для Anna1
 
Регистрация: 30.11.2010
Сообщений: 6
По умолчанию Разбор полетов. (мучительное осознание кода)

Уважаемый EducatedFool !!!
Я попыталась понять созданное Вами, но пока мне это слабо удается! Помогите, пожалуйста.) Тут даны робкие комментарии того, что я поняла, а что - нет. [Красным выделено на мой взгляд, важное, но совсем не понятное]

Dim pi As ProgressIndicator Определяем индикатор процесса (НЕ ОБЯЗАТЕЛЬНО)
Sub Запуск()
Dim cell As Range, ra As Range, SearchRange As Range, newcell As Range Задаем тип переменных Set ra = shs.Range(shs.[A2], shs.Range("A" & shs.Rows.Count).End(IIf(Len(shs.Ran ge("A" & shs.Rows.Count)), xlDown, xlUp))) Что такое shs. – Sheeets??? Видимо,определеяем массив, который начинается с ячейки А2 и заканчивается вместе с окончанием рядов??? Дальше не знаю совсем функцию. Возможно, определение последнего значения в строке On Error Resume Next Указывает, что возникновение ошибки выполнения приводит к передаче управления на инструкцию, непосредственно следующую за инструкцией, при выполнении которой возникла ошибка (не совсем ясно, зачем)
Set pi = New ProgressIndicator Индикатор процесса
pi.Show "Получение данных с сайта" Индикатор процесса pi.StartNewAction , 99, , , , ra.Cells.Count Индикатор процесса
For Each cell In ra.Cells
pi.SubAction "Отчётный период: " & cell, "Ссылка: " & cell.Next.Hyperlinks(1).Address, _ Индикатор процесса "Заполнено строк: " & shd.UsedRange.Rows.Count - 1 Индикатор процесса SearchLink$ = "URL;" & cell.Next.Hyperlinks(1).Address Индикатор процесса

Set SearchRange = Nothing: Set SearchRange = GetQueryResult(SearchLink$, cell.Text) Использовать результаты запроса (ДАЛЬШЕ непонятно) Set newcell = shd.Range("A" & shd.Rows.Count).End(xlUp).Offset(1)
newcell.Resize(SearchRange.Rows.Cou nt, SearchRange.Columns.Count).Value = SearchRange.Value

' Dim cell2 As Range, ra2 As Range
' For Each cell2 In newcell.Offset(, 5).Resize(SearchRange.Rows.Count).C ells
' cell2.Value = cell2.Value
' Next cell2
DoEvents
Next cell Переход к следующей ячейке
ra.EntireRow.AutoFit Видимо, автоподбор ширины столбца
pi.Hide Скрыть индикатор
End Sub

Sub Очистка() Если необходимо очистить лист (не обязательно)
shd.Range(shd.[A2], shd.Range("A" & shd.Rows.Count).End(xlUp)).Resize(, 20).ClearContents Если необходимо очистить лист (не обязательно) ActiveWindow.ScrollRow = 2 Если необходимо очистить лист (не обязательно)End Sub Если необходимо очистить лист (не обязательно)

Function GetQueryResult(ByVal SearchLink$, ByVal sTime As String) As Range
' возвращает диапазон - с результатами запроса
On Error Resume Next
tmp.UsedRange.ClearContents: DoEvents
With tmp.QueryTables.Add(SearchLink$, tmp.Range("c1"))
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.WebSelectionType = xlSpecifiedTables
.WebTables = "7" .WebTables = "7" – Видимо, для всех таблиц, это был все-таки номер 7???????????
DoEvents
.Refresh BackgroundQuery:=False: DoEvents
Квартал = Left(sTime, 1) Преобразователь исходных данных Год = Split(sTime, " ")(1) Преобразователь исходных данных Dim ResultRange As Range
Set ResultRange = tmp.Range(tmp.[c2], tmp.Range("c" & tmp.Rows.Count).End(xlUp)).Offset(, -2) ResultRange.Value = Квартал
ResultRange.Offset(, 1).Value = Год
ResultRange.Offset(, 5).Value = Application.Trim(ResultRange.Offset (, 5).Value)
ResultRange.Offset(, 5).Replace ".", ",", xlPart
ResultRange.Offset(, 5).Value = ResultRange.Offset(, 5).Value
Set GetQueryResult = ResultRange.Resize(, 6)
.Delete: DoEvents
End With
End Function

Последний раз редактировалось Anna1; 30.11.2010 в 13:22.
Anna1 вне форума Ответить с цитированием
Старый 30.11.2010, 13:22   #9
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Немного доработал макрос:



Теперь суммы попадают в ячейки в числовом формате, и для некоторых ссылок за 2002 год удаляется лишний столбец в веб-запросе.
EducatedFool вне форума Ответить с цитированием
Старый 30.11.2010, 13:30   #10
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
Что такое shs
Это кодовое имя листа с исходными данными

Цитата:
Видимо,определеяем массив, который начинается с ячейки А2 и заканчивается вместе с окончанием рядов?
Ага, берем диапазон ячеек с А2 до последней заполненной в столбце А

Цитата:
Set SearchRange = GetQueryResult(SearchLink$, cell.Text, cell.Next.Text)
Функция GetQueryResult получает 3 параметра:
1) ссылку на сайт
2) текст ячейки с листа ИСХОДНЫЕ ДАННЫЕ - из первого столбца (дату)
3) текст ячейки с листа ИСХОДНЫЕ ДАННЫЕ - из второго столбца

Эта функция на скрытом листе с кодовым именем tmp выполняет веб-запрос,
и возвращает объект типа Range - диапазон ячеек скрытого листа tmp, где содержатся результаты запроса
Эта же функция добавляет 3 столбца перед результатами (во всех строках - одно и то же) - чтобы видеть, по какому из запросов получены данные.

Цитата:
.WebTables = "7" – Видимо, для всех таблиц, это был все-таки номер 7?
Именно так

Вообще, это не совсем тот макрос, с которого следовало бы начинать изучение макросов - для начинающего он будет сложноват.
Я бы сам не разобрался в макросах, если бы начал изучение VBA с такого...
EducatedFool вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
получение списка ссылок на подпапки файлы однойпапки i777 Microsoft Office Excel 3 06.10.2010 23:30
использование списка для структуры dimulka2010 Помощь студентам 0 28.03.2010 15:46
Программа для сканирования ссылок на сайте. antoha.by Помощь студентам 6 27.07.2008 17:58
LinkCollector - менеджер закладок для захвата и хранения ссылок AnalogXP Софт 15 21.01.2008 13:15