PHP

Как котировки металлов Сбербанка вставить в ячейку таблицы Excel?

С сайта http://data.sberbank.ru/oryol/ru/quotes/metal/
Необходимо вставить в ячейки B2 и B3 таблицы MS Excel данные о покупке и продаже золота соответственно. А также в ячейки C2 и C3 данные о покупке и продаже серебра соответственно.
Вывод значений формата 0,00 р.
Набросал скрипт на VBA для этого сайта:

Sub GetData()
Const strSite As String = "http://data.sberbank.ru/oryol/ru/quotes/metal"
Const strSiteTableClass As String = "table3_eggs4"
Const strRange As String = "Sheet2!A1"
Const iTimeOut As Integer = 5

On Error GoTo errGetData
Dim objRng As Range
Dim objIE As Object
Dim objData As Object
Dim dtStart As Date

Set objRng = Range(strRange)
Set objIE = CreateObject("InternetExplorer.Application")
objIE.Visible = False

dtStart = Now()
objIE.Navigate strSite

While objIE.Busy Or objIE.ReadyState <> 4
DoEvents
If DateDiff("s", Now(), dtStart) >= iTimeOut Then
Err.Raise vbObjectError, , "Timeout"
End If
Wend

Set objData = objIE.document.getElementsByClassName(strSiteTableClass)(0)
objRng.Value = CDbl(objData.Rows(1).Cells(2).innerHTML)
objRng.Offset(0, 1) = CDbl(objData.Rows(1).Cells(4).innerHTML)

objRng.Offset(1, 0).Value = CDbl(objData.Rows(2).Cells(2).innerHTML)
objRng.Offset(1, 1).Value = CDbl(objData.Rows(2).Cells(4).innerHTML)
objIE.Quit
Exit Sub

errGetData:
On Error Resume Next
Range(objRng, objRng.Offset(1, 1)).Value = "Нет данных"
objIE.Quit
End Sub

P.S: Проверено работает. Пока структуру сайта не поменяют ^_^. Помещает в область указанную в strRange (ИмяЛиста! ячейка) данные с этого сайта или "Нет данных", если не удалось их получить.
iTimeOut - время ожидания в секундах (Sleep нет в VBA пришлось так)
Формат ячеек без проблем зададите сами (правая кнопка на ячейках, формат)

Пишите в комментах или на почту если что.
Dima Kravetc
Dima Kravetc
84 764
Лучший ответ
Иван Дьяченко Вроде за ночь структуру сайта не изменили, но в ячейках только "Нет данных" (см. скрин с макросом)
Иван Дьяченко Вообщем-то при запуске макроса он лезет в Сбер, а потом сразу ошибка.
P.S. комп не очень слабенький=) тайм-аут выставил = 7
Dima Kravetc Если кому понадобится - проблема оказалась в старом IE (он не поддерживает GetElementsByClassName). Пришлось получать данные через Tag
Соотв. строку

Set objData = objIE.document.getElementsByClassName(strSiteTableClass)(0)

Надо заменить на
Set objData = objIE.Document.GetElementsByTagName("table")(1)
в идеале в 2007 офисе можно было бы сделать "данные - из интернета" и на сайте сбера ухватить таблицу и импортировать в эксель.. ОБновление таблицы происходит либо по запросу, либо при каждом открытии файла, но для этого страница сбера должна содержать . А там по ходу 'ы... Так что ответ остается в разделе мысли и подсказки