Макрос получения курсов доллара за период с сайта Банка России
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="
Запрос будет неполным без указания даты, которую для каждой строчки мы возьмем из столбца, который предварительно датами заполнили.
Dim i As Long
i = 1
Dim strDate As String
Do While Not Range("a" & i) = ""
strDate = Format(Range("a" & i), "dd\/mm\/yyyy")
Всякое бывает с сайтами или вашим интернетом, поэтому нужно проверить результаты попытка загрузки xml файла.
If xmlDoc.Load(strRateSource & strDate) <> True Then
MsgBox "Сайт ЦБ сейчас не в духе, попробуйте обратиться к нему позже..."
Exit Sub
End If
Если же загрузка прошла успешно, то начинается магия xPath. Сначала получим дату, к которой на самом деле привязан курс доллара. Она не всегда совпадает с той датой, на которую вы курс запросили. И поместим дату ЦБ в столбец «B»
Range("b" & i) = xmlDoc.selectNodes("//ValCurs")(0).Attributes(0).Text
"//ValCurs" – это и есть выражение 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
MS, Libreoffice & Google docs
719 постов15K подписчика
Правила сообщества
1. Не нарушать правила Пикабу
2. Публиковать посты соответствующие тематике сообщества
3. Проявлять уважение к пользователям
4. Не допускается публикация постов с вопросами, ответы на которые легко найти с помощью любого поискового сайта.
По интересующим вопросам можно обратиться к автору поста схожей тематики, либо к пользователям в комментариях
Важно - сообщество призвано помочь, а не постебаться над постами авторов! Помните, не все обладают 100 процентными знаниями и навыками работы с Office. Хотя вы и можете написать, что вы знали об описываемом приёме раньше, пост неинтересный и т.п. и т.д., просьба воздержаться от подобных комментариев, вместо этого предложите способ лучше, либо дополните его своей полезной информацией и вам будут благодарны пользователи.
Утверждения вроде "пост - отстой", это оскорбление автора и будет наказываться баном.