Макрос получения курсов доллара за период с сайта Банка России

Excel (Эксель) прекрасен, а мир огромен. И готов предложить для анализа много разной информации из сети под названием Интернет. Часто видел, как аналитики мужеского и женского рода просто перебивают ручками данные со страниц разных сайтов для своей работы.

Иногда целесообразнее написать небольшой макрос, который будет получать данные из интернета автоматически. Для этого уже давно придуман Microsoft XML parser (MSXML).

Для примера, я и покажу, как с его помощью получить курсы доллара за период с сайта ЦБ.

  1. Организуем столбец с датами на одной из «Sheets» экселя. У меня это столбец «A»
  2. Подключяем ссылку на Microsoft XML
  3. Собственно пишем процедуру

Sub GetUSDRates4Period()
                                

Объявляем переменные и открываем окно в мир интернета:

    Dim strCCY As String, strRateCCY As String, strRateSource As String
    Dim xmlDoc As MSXML2.DOMDocument
    Set xmlDoc = New MSXML2.DOMDocument
    xmlDoc.async = False
                                

MSXML2 – это и есть упомянутый выше Microsoft XML parser, который нужно направить на сайт Банка России.

    strRateSource = "http://www.cbr.ru/scripts/XML_daily.asp?date_req="
                                

Всякое бывает с сайтами или вашим интернетом, поэтому нужно проверить результаты попытки загрузки xml файла.

        If xmlDoc.Load(strRateSource & strDate) <> True Then
            MsgBox "Сайт ЦБ сейчас не в духе, попробуйте обратиться к нему позже..."
            Exit Sub
        End If
                                

Если же загрузка прошла успешно, то начинается магия xPath. Сначала получим дату, к которой на самом деле привязан курс доллара. Она не всегда совпадает с той датой, на которую вы курс запросили. И поместим дату ЦБ в столбец «B»

        Range("b" & i) = xmlDoc.selectNodes("//ValCurs/@Date")(0).Text
                                

"//ValCurs/@Date" – это и есть выражение XPath, которое может быть очень интересным и витиеватым, и которое позволяет добраться практически до любой точки xml файла. В вышеприведенном примере я взял дату валютирования из тега ValCurs. А ниже выражение посложнее. С его помощью я нахожу валюту «доллар» среди множества других (у этой валюты ID=R01235) и прошу показать мне только курс этой валюты (там есть и другая информация: буквенный и цифровой коды валюты в соответствии с ISO 4217 и/или ОКВ, номинал, описание, - но нам нужен только курс).

        strRateCCY = xmlDoc.selectNodes("//Valute[@ID='R01235']/Value")(0).Text
                                

Далее я привожу текст с курсом к числу с учетом настроек символа разделителя разрядов.

        Range("c" & i).Value = CdblLocaleIndependent(strRateCCY)
                                

Функцию CdblLocaleIndependent в этом посте показывать не буду, пока желающих на нее посмотреть не будет достаточно.

Закругляемся с циклом и заканчиваем работу:

        i = i + 1
    Loop
    MsgBox "Курсы сняты с сайта Банка России."
End Sub