Страницы: 1
RSS
Как написать правильный адрес для запроса
 
Всем добрый день.  
Заранее прошу прощение, за возможный вопрос не по теме форума. Но я даже не знаю, на какой форум мне податься. Может если мой вопрос ответа здесь не найдет, то хоть пните в нужном направлении.  
Проблема такая:  
На сайте http://stocks.investfunds.ru/stocks/leaders.phtml есть таблиц    
«Лидеры роста». В таблице этой 7 вкладок: за день, за неделю, за месяц и т.д.  
Есть макрос, который подгружает эту таблицу в EXCEL файл. Но он может подгрузить ее только первую страницу «За день», а вот остальные семь не хочет.    
Ссылка у каждой странице разная типа «javascript:%20change(1);» «javascript:%20change(2);» и т.д. (что это значит, представляю на уровне догадок)  
У общей таблицы ссылка такая «http://stocks.investfunds.ru/stocks/leaders.phtml#growth»  
Вот собственно и вопрос как в макросе URL правильно написать, я так думаю нужно соединить воедино полный адрес таблицы и ссылку на конкретный лист, чтобы он подтягивал тот лист который нужно.  
Перепробовал кучу вариантов, но все никак. Может свойство какое есть специальное или метод у QueryTables.    
Всем заранее спасибо
 
> Может свойство какое есть специальное или метод у QueryTables  
C QueryTables я особо не сталкивался, поэтому не знаю, можно ли встроенными средствами реализовать задумку.  
 
Принцип отображения таблиц на сайте:  
В странице, скачиваемой по указанной Вами ссылке, уже присутствуют ВСЕ значения ВСЕХ таблиц.  
 
Вот исходный код страницы:  
 
data_arr2[6][28]='[tr][td]28. ....';
data_arr2[6][29]='[tr][td]29. [/td][td]....[/tr]';
data_arr2[6][30]='[tr][td]30. .....[/td][/tr]';
data_arr[7]=new Array();
data_arr[7][1]='[tr][td]1. [/td][td]<a href="/stocks/738/...[/tr]';
data_arr[7][2]...
 
 
 
Навскидку могу предложить 2 варианта:  
 
1) Скачиваем макросом страницу (её HTML - код) в текстовый файл, и парсим её, выдирая из вышеприведённого текста нужные данные.  
Недостаток такого варианта - очень много сложного кода.  
 
 
2) Работаем с объектной моделью документа.  
Грузим страницу, считываем таблицу, программно щелкаем на следующей вкладке для запуска function change(gid), считываем следующую таблицу, и т.д.  
 
Кое-что по теме можно почитать здесь: http://www.planetaexcel.ru/forum.php/?thread_id=12478
 
Реализовал (частично) второй вариант: http://excelvba.ru/XL_Files/Sample__07-02-2010__18-58-30.zip  
 
Запустите форму, дождитесь, пока страница загрузится полностью, номажимайте кнопку на форме.  
 
 
Вот весь код:  
 
Const addr = "http://stocks.investfunds.ru/stocks/leaders.phtml#growth"  
Dim i As Integer  
 
Private Sub CommandButton1_Click()  
   i = 1 + i Mod 7: ie.Navigate "javascript: change(" & i & ")"  
End Sub  
 
Private Sub UserForm_Initialize(): ie.Navigate addr: End Sub  
 
 
 
PS: Для переключения страниц во ВТОРОЙ таблице (Лидеры падения)  
вместо  javascript: change  
поставьте  javascript: change2
 
Буду переваривать доделывать :)  
Еще раз спасибо.
 
Вот более усовершенствованный вариант:  
http://excelvba.ru/XL_Files/Sample__07-02-2010__19-29-37.zip  
 
(Если во время запуска формы будут вылетать ошибки, нажимайте CONTINUE.  
Почему вылетают ошибки - не понимаю - ведь используется On Error Resume Next    
Возможно, это у меня Excel глючит)  
 
 
Нажмите кнопку "считать таблицу" после выбора нужной вкладки.  
 
PS: Считывать ТЕКСТ таблицы, вместо того, чтобы в цикле перебирать её ячейки, - не лучшая идея. (сделал лишь для демонстрации такой возможности)  
 
Лучше будет в цикле пройтись по строкам и столбцам.  
Сейчас попробую сделать пример.  
 
PPS: Форма с IE сделана лишь для удобства отладки.  
После изготовления работоспособного кода её можно убрать, создавая объект IE динамически.
 
Ну а вот и окончательный вариант макроса:  
http://excelvba.ru/XL_Files/Sample__07-02-2010__20-03-21.zip  
 
Нажмите зеленую кнопку - через несколько секунд на листе появится таблица.  
Номер таблицы (номер вкладки на сайте) и начальная ячейка для вставки таблицу задаются в качестве параметров макроса:  
 
 
Sub test()  
   СкачатьТаблицу 5, [a2]
End Sub  
 
Sub СкачатьТаблицу(ByVal НомерТаблицы As Integer, ПерваяЯчейка As Range)  
   Set IE = CreateObject("InternetExplorer.Application"): DoEvents  
   NavStr = "http://stocks.investfunds.ru/stocks/leaders.phtml#growth"  
 
   IE.Navigate NavStr  
   While IE.ReadyState <> 4: DoEvents: Wend  
 
   IE.Navigate "javascript: change(" & НомерТаблицы & ")"  
   'While IE.ReadyState <> 4: DoEvents: Wend  
 
   Set ieDoc = IE.Document: On Error Resume Next  
   Application.ScreenUpdating = False  
 
   Set t = ieDoc.getElementById("maintable1").all.Item(0)  
   For i = 0 To t.Rows.Length - 1  
       With t.Rows.Item(i).Cells  
           For j = 1 To 5  
               txt = .Item(j - 1).innerText  
               Select Case j  
                   Case 1: txt = Replace(txt, ".", "")  
                   Case 4: txt = CDbl(Replace(Replace(txt, " ", ""), ".", "."))  
                   Case 3: txt = "'" & txt  
                   Case 5: txt = Split(Replace(txt, ".", ","), " ")(0)  
               End Select  
               ПерваяЯчейка(i, j) = txt  
           Next j  
       End With  
   Next i  
   IE.Quit:    Set IE = Nothing  
   ПерваяЯчейка.Resize(, 5).EntireColumn.AutoFit  
   Application.ScreenUpdating = True  
End Sub
 
Хотел у Вас спросить. Вы говорили о ячейках и столбцах какой-то таблицы,  
Я так подозреваю эта таблицы, которые присутствуют на WEB-страницах.    
Мне, по ходу дела, часто придется вытаскивать информацию из WEB-а. Хотел у вас спросить:  
Может вы литературу, какую посоветуете или сайты, что бы можно было получше понять механизм получения нужной информации с WEB страниц, да и то как они устроены, а то если честно я в Вашем коде ни чего не понял, много нового для меня,  
а научиться делать такие вот вещи очень даже нужно.  
Заранее благодарю,
 
> Не думал что Вы будете возиться ))  
У меня было 2 часа свободного времени. Не знал, чем заняться... решил помочь)  
 
 
> Может вы литературу, какую посоветуете или сайты, что бы можно было получше понять механизм получения нужной информации с WEB страниц, да и то как они устроены  
 
Для начала изучите объектную модель HTML-документа  
см. ссылки в этом сообщении: http://www.programmersforum.ru/showpost.php?p=285155&postcount=2  
 
Можно также использовать Watch в отладчике VBA, чтобы видеть структуру загруженной веб-страницы.  
 
С иерархией объектов и методами можно ознакомится, подключив к проекту VBA библиотеку Microsoft HTML Object Library  
 
Для анализа структуры сайта я использую браузер Firefox c подключенными расширениями Firebug и WebDeveloper.  
 
Будут конкретные вопросы (например, как скачать вот эту табличку вот с этого сайта) - обращайтесь через Скайп. Постараюсь помочь.  
Могу и кое-что из общих принципов разъяснить, но только не по переписке - времени жалко.  
 
PS: Сам этому научился за несколько часов методом научного тыка))  
Так что сложного абсолютно ничего нет - программно работать из VBA с веб-страницей не сложнее, чем с диаграммой или сводной.
 
EducatedFool  
Записал в блокнотик! На всякий случай))) Случаи они же разные бывают...
 
Буду изучать .
Страницы: 1
Читают тему
Наверх