Страницы: 1 2 След.
RSS
таблица заполняемая из веб-запроса
 
Помогите пожалуйста решить задачу заполнения таблицы из веб-запроса.  
Запрос по курсам валют идет с сайта банка и ежедневно обновляется. (кстати, так и не понял как сделать кнопку, чтобы обновлять эти данные)  
Необходимо, чтобы ежедневно при обновлении запроса новые курсы заносились в таблицу и проставлялась дата этих курсов. Каждый раз в новую строку. В итоге должна получится таблица, дополняемая ежедневно новой строкой.
 
Добрый день  
 
Попробуйте такой вариант - от вашего конечно отличается, но информацию тянет с того же сайта
 
Спасибо!    
немного подкрутил и получилось то, что нужно!  
 
Единственный вопрос остался - как прописать в макросе проверку по датам.  
Т.е. Сейчас при нажатии на кнопку макрос прописывает новую строку, даже если такая уже есть (проверяю по дате). А хочется, чтобы макрос прежде сверял дату по столбцу А, есть ли строка с текущей датой уже или нет и если есть, ничего не вносил в таблицу.  
Т.е. в итоге через какое-то время таблица получится из уникальных строк на любую дату
 
Если завтра до утра никто не подскажет - приду на работу, доделаю
 
Может так?  
 
Option Explicit  
Sub test()  
   Dim SH As Worksheet  
   Dim R As Range, lRow As Long, aDate As Date  
   Application.ScreenUpdating = False  
   Sheets.Add After:=Sheets(Sheets.Count)  
   Set SH = Sheets(Sheets.Count)  
   With SH.QueryTables.Add(Connection:="URL;http://alfabank.ru", Destination:=Range("$A$1"))  
       .WebFormatting = xlWebFormattingNone  
       .WebTables = "5"  
       .Refresh BackgroundQuery:=False  
   End With  
 
   Set R = SH.Cells.Find(What:="Курсы валют на", LookAt:=xlPart)  
   With Sheets("Курсы валют")  
       lRow = .Cells(.Rows.Count, 1).End(xlUp).Row  
       aDate = CDate(Replace(R, "Курсы валют на ", ""))  
       If .Cells(lRow, 1) <> aDate Then  
           .Cells(lRow + 1, 1) = aDate  
           .Cells(lRow + 1, 2) = R.Offset(4, 3)  
           .Cells(lRow + 1, 3) = R.Offset(3, 3)  
       End If  
   End With  
   Application.DisplayAlerts = False  
   SH.Delete  
   Application.DisplayAlerts = True  
   Application.ScreenUpdating = True  
End Sub
 
Благодарю! все работает.  
Теперь буду разбираться с кодом...
 
Добрый день  
Хотел бы поднять тему, т.к. с 1 апреля (не шутка =) ) у меня перестал работать код, который описан на 2 сообщения выше.  
Либо на сайте какие-то изменения произошли или это у меня что-то случилось, но теперь при запуске макроса мне выдается ошибка вот в этой строке  
aDate = CDate(Replace(R, "Курсы валют на ", ""))  
 
К сожалению, я не разбираюсь в коде и поэтому прошу вашей помощи.  
Спасибо!
 
тема уползла далеко вниз.  
Вроде правилами не запрещено ее поднимать...  
 
Помогите с моим вопросом, пожалуйста.
 
Layout сайта изменился. Блок с курсами уплыл вниз.
 
{quote}{login=longines}{date=08.04.2011 07:47}{thema=}{post}Layout сайта изменился. Блок с курсами уплыл вниз.{/post}{/quote}  
 
Спасибо. Я подозревал, что что-то с сайтом, но все равно исправить не смогу...  
 
методом перебора только выяснил, что в строке ниже надо поменять 5 на 7  
.WebTables = "7"  
Но у меня в этом  случае создается в книге новый лист и туда вставляется вся таблица с курсами, а должно вставляться на лист "курсы валют" именно за нужный день.  
 
прикладываю книгу с этими изменениями
 
пост выше мой, забыл залогиниться.
 
уважаемые форумчане, неужели никто не знает, как это сделать? =(
 
Там судя по всему поменялся дизайн, и теперь даты нет в этой табдице.  
Кроме того, у меня пропал десятичный разделитель на существующем коде...  
Нужно менять код - делать по алгоритму UDF по извлечению курсов, т.е. искать в тексте ответа сервера нужные данные. Они там есть:  
слова для привязки  
"exchange-rates" или "Курсы валют на "  
"USDnoncashBuy"  
"USDnoncashSell"  
"EURnoncashBuy"  
"EURnoncashSell"  
 
<div id="exchange-rates" class="exchange-rates"><h2>Курсы валют на 13.04.11</h2><div class="rates-block frame-gray"><div class="frame-gray-tl"><spacer></spacer></div><div class="frame-gray-tr"><spacer></spacer></div><div class="frame-gray-bl"><spacer></spacer></div><div class="frame-gray-br"><spacer></spacer></div><h3><span>Для отделений, <nobr>интернет-банка</nobr>, внесения наличных в банкомат</span></h3><div class="reducer">
<br>покупкапродажа
USD27,728,54
EUR39,503741,5248
Данные о курсах валют могут сохраняться в вашем браузере. Для получения актуальной информации обновите страницу.
<div class="b-converter" id="converterNonCash"><h4>Посчитать</h4><div class="h-converter hidden"><tbody></tbody>
<input type="text" name="currencyFromValueNonCash" id="currencyFromValueNonCash" length="4" maxlength="8"><select name="currencyFromTypeNonCash" id="currencyFromTypeNonCash"><option value="RUR">RUR</option><option value="EUR">EUR</option><option value="USD">USD</option></select>
<tbody></tbody>
</div></div></div></div><script type="text/javascript">
 
Парсинг HTML в VBA - занятие не самое приятное, так как легких инструментов для этого в языке нет. Но на сайте Альфабанк есть еще RSS лента с курсами валют. Рекомендую смотреть в эту сторону. Если решитесь, я думаю на этом форуме вам помогут.
 
{quote}{login=longines}{date=14.04.2011 12:08}{thema=}{post}Парсинг HTML в VBA - занятие не самое приятное, так как легких инструментов для этого в языке нет. Но на сайте Альфабанк есть еще RSS лента с курсами валют. Рекомендую смотреть в эту сторону. Если решитесь, я думаю на этом форуме вам помогут.{/post}{/quote}  
 
RSS есть конечно, но неужели с ним проще? я в принципе в этом не разбираюсь, но желание как-то это сделать естественно есть, т.к. мне для работы необходимо каждый день обновлять курсы альфы. Если кто-то сможет помочь в этом вопросе, буду крайне признателен.
 
Я тоже глянул RSS - по-моему, разницы нет, откуда тянуть, там не проще.  
Алгоритм такой - получаем в переменную текст страницы, потом по Instr() в переменной находим нужное место например по id="USDnoncashBuy"> находим место отсчёта, берём правее на 19 символов следующие 10 - получаем "27,7[/td]<" (это чтоб точно взять всё, если разрядность добавится).
Из этого выбираем число любым методом - я например заменял по одному все символы [/td] на пусто.
Так можно получить и дату, и все курсы.
 
Вот по курсам (для даты нужно переделывать тип):  
 
Option Explicit  
 
Function KursAlfaBank(Optional Kod_Valuti = "USDnoncashBuy") As Currency  ' запрос курса любой валюты с сайта  
  '---------------------------------------------------------------------------------------  
  ' Procedure : Курс банка  
  ' Author    : Основа - ZVI:2008-10-31, коррекция - Alex_ST: 2010-01-28, Hugo: 2011-04-14  
  '---------------------------------------------------------------------------------------  
  Dim Zapros As String, Otvet As String, Kurs As String  
  Dim oHttp As Object  
  Dim sep_ As String  
  Zapros = "http://alfabank.ru"  
  On Error Resume Next  
  Set oHttp = CreateObject("MSXML2.XMLHTTP")  
  If Err <> 0 Then Set oHttp = CreateObject("MSXML.XMLHTTPRequest")  
  If oHttp Is Nothing Then Exit Function  
  oHttp.Open "GET", Zapros, False  
  oHttp.Send  
  Otvet = UCase(oHttp.responseText)  
     
   Kurs = Mid(Otvet, InStr(1, Otvet, UCase(Trim(Kod_Valuti))) + 15, 10)  
   Kurs = Replace(Kurs, "<", "")  
   Kurs = Replace(Kurs, "/", "")  
   Kurs = Replace(Kurs, "T", "")  
   Kurs = Replace(Kurs, "D", "")  
   Kurs = Replace(Kurs, ">", "")  
         
  Set oHttp = Nothing  
     
  '--------- подгоняем под системный разделитель ---------------------------  
sep_ = Mid$(1 / 2, 2, 1)  
Kurs = Replace(Kurs, ",", sep_)  
  '--------------------------------------------------------------------------------------------------  
     
  KursAlfaBank = CCur(Kurs)  
End Function  
 
Но для Вас конечно нужно ещё добавить процедуру переноса/копирования.
 
{quote}{login=Hugo}{date=14.04.2011 09:35}{thema=}{post}Я тоже глянул RSS - по-моему, разницы нет, откуда тянуть, там не проще.  
Алгоритм такой - получаем в переменную текст страницы, потом по Instr() в переменной находим нужное место например по id="USDnoncashBuy"> находим место отсчёта, берём правее на 19 символов следующие 10 - получаем "27,7[/td]<" (это чтоб точно взять всё, если разрядность добавится).
Из этого выбираем число любым методом - я например заменял по одному все символы [/td] на пусто.
Так можно получить и дату, и все курсы.{/post}{/quote}  
 
Спасибо за совет, смысл понял, но для меня это китайская грамота =)
 
Проще, так как XML - это стандарт, внедренный в Excel.  
Делаем референсы на MSXML 6.0 и WinHTTP.  
 
Option Explicit  
 
Sub alpha()  
Dim ht As New WinHttp.WinHttpRequest, data, date_c As String  
Dim xmldoc As New MSXML2.DOMDocument60, xmldoc2 As New MSXML2.DOMDocument60, xmlNode As IXMLDOMNode  
Dim USD_Buy$, USD_Sale$, Euro_Sale$, Euro_Buy$, rows_count&, div  
With ht  
.Open "GET", "http://alfabank.ru/_/rss/_currency.html", False  
.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)"  
.send  
data = .responseText  
End With  
With xmldoc  
.LoadXML (data)  
Set xmlNode = .SelectSingleNode("//item/title")  
date_c = xmlNode.Text  
Set xmlNode = .SelectSingleNode("//item/description")  
data = xmlNode.Text  
date_c = Replace(date_c, "Курсы валют на ", "")  
End With  
With xmldoc2  
.LoadXML (data)  
Set xmlNode = .SelectSingleNode("//div/div")  
data = xmlNode.Text  
Euro_Sale = Right(data, 7)  
Euro_Buy = Mid(data, Len(data) - 13, 7)  
USD_Sale = Mid(data, Len(data) - 22, 5)  
USD_Buy = Mid(data, Len(data) - 27, 5)  
End With  
With Sheets("Курсы валют")  
div = Format$(0, ".")  
rows_count = .Cells(Rows.Count, 1).End(xlUp).Row  
.Cells(rows_count + 1, 2).Value = Val(Replace(Euro_Buy, ",", div))  
.Cells(rows_count + 1, 3).Value = Val(Replace(USD_Buy, ",", div))  
.Cells(rows_count + 1, 1).Value = CDate(date_c)  
End With  
End Sub
 
У меня на 2000 xml не сработало - референсы без missing, но не пашет...  
На .send зависло:  
.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)"  
.send
 
{quote}{login=}{date=14.04.2011 02:07}{thema=}{post}Проще, так как XML - это стандарт, внедренный в Excel.  
Делаем референсы на MSXML 6.0 и WinHTTP.  
....  
{/post}{/quote}  
 
Попробовал ваш код и пример, но у меня почему-то теперь ошибку выдает в строке    
.send  
 
Заметил, что в коде есть строка  
.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)"    
с упоминанием MSIE 8.0. А у меня еще IE6 =(
 
Если зависает, то нужно убрать строку, начинающуюся с .setRequestHeader.    
Это своего рода противоядие против запрещения роботов. На сайте Альфа-банка такой защиты нет, проверил.
 
Мне не помогло...
 
А какая ошибка? Возможно, проблема с прокси. Если вы выходите в Интернет через прокси, то нужно сконфигурировать WinHTTP 5.1 прокси настройки, так как он использует свои, а не смотрит в настройки IE. По-умолчанию, WinHTTP пытается подсоединиться к Интернету напрямую.  
Для настройки используется метод SetProxy. Или программа ProxyCFG.exe.  
Например, .SetProxy HTTPREQUEST_PROXYSETTING_PROXY, "localhost:80"  
 
В любом случае, важно скачать сам файл http://alfabank.ru/_/rss/_currency.html    
любым образом, а потом обработать с помощью Microsoft XML.  
Можете заменить на любой работающий у вас.  
Загрузка прямо в MSXML 6.0 без скачивания возможна теоретически, но  у меня по непонятным причинам этот вариант не прошел. Может надо было поставить DoEvents.
 
Дома на XL2007 отработало быстро и правильно прямо как есть post_218642.xls.  
Вероятно, на работе прокси резал.
 
Хотя насчёт "правильно" потропился - десятые отрезало. Но это мелочь...
 
{quote}{login=Hugo}{date=14.04.2011 08:22}{thema=}{post}Хотя насчёт "правильно" потропился - десятые отрезало. Но это мелочь...{/post}{/quote}  
 
Значит проверка системный разделитель дробных значений с помощью Format не работает...
 
Нет, это работает.  
Не работает Val() - я заменил на    
CCur(Replace(Euro_Buy, ",", div))  
Порядок.
 
Хотя нет, лучше CDbl()
 
{quote}{login=Hugo}{date=14.04.2011 11:19}{thema=}{post}Хотя нет, лучше CDbl(){/post}{/quote}  
 
спасибо за ответы.    
К сожалению у меня похоже прокси режет и не дает скачивать данные, хотя раньше то все работало.. странно.  
попробую проверить дома
Страницы: 1 2 След.
Наверх