Курс доллара для любой заданной даты
Самые популярные в России курсы - это курсы валют.
Правда, на них мало учат, зато много наказывают.
Если Вам часто приходится узнавать курс доллара для определенной заданной даты в прошлом (даты заказа или поставки, например), то этот макрос сэкономит вам много времени. Вместо похода в архивы ЦБР достаточно будет его запустить.
Откройте редактор Visual Basic, нажав ALT+F11 или выбрав на вкладке Разработчик команду Редактор Visual Basic (Developer - Visual Basic), вставьте новый модуль (меню Insert - Module) и скопируйте туда текст этого макроса:
Sub GetDollar() Dim sURI As String, oHttp As Object, htmlcode, outstr As String, inpdate As Date 'выводим диалоговое окно с вопросом о дате inpdate = CDate(InputBox("Введите дату в формате ДД.ММ.ГГГГ", "Курс доллара", Date)) 'формируем строку для веб-запроса sURI = "https://cbr.ru/currency_base/daily/?UniDbQuery.Posted=True&UniDbQuery.To=" & Format(inpdate, "DD.MM.YYYY") 'делаем запрос On Error Resume Next Set oHttp = CreateObject("MSXML2.XMLHTTP") If Err.Number <> 0 Then Set oHttp = CreateObject("MSXML.XMLHTTPRequest") End If On Error GoTo 0 If oHttp Is Nothing Then Exit Sub End If oHttp.Open "GET", sURI, False oHttp.Send 'получаем HTML страницы с курсами и извлекаем из него курс доллара htmlcode = oHttp.responseText outstr = Mid(htmlcode, InStr(InStr(1, htmlcode, "USD"), htmlcode, "") - 22, 7) Set oHttp = Nothing 'заменяем точку на запятую и выводим в активную ячейку outstr = Replace(outstr, ",", ".") ActiveCell.Value = outstr End Sub
Теперь, если закрыть редактор Visual Basic и вернуться в Excel, то через меню Сервис - Макрос - Макросы, или нажав ALT+F8, можно запустить наш макрос GetDollar, ввести в появившееся окно дату и получить курс доллара для заданной даты в текущей ячейке. Для удобства запуска можно сделать кнопку макроса на панели инструментов или на листе или назначить макросу сочетание клавиш.
Фактически, макрос загружает данные из архива сайта Центробанка РФ, поэтому для вставки курса в текущую ячейку необходимо иметь доступ в интернет (в данный момент). Данные вставляются как константы (без связи и обновления).
Для получения курса евро, иены, фунта и других валют необходимо лишь поменять в коде код валюты "USD" на любой нужный вам, например "EUR", "KZT" и т.д.
Ссылки по теме
- Импорт курса валют из интернета с автоматическим обновлением
- Что такое макросы. Как и куда вставлять текст макроса на Visual Basic.
- Вставка курса любой валюты на любую дату с помощью надстройки PLEX
- Функция CBR из надстройки PLEX
Давно пользуюсь этим замечательным макросом для разных нужд.
Но вот возникла потребность, чтобы молча загружались нужные курсы на сегодня, без окна запроса.
Можно это как-то реализовать?
1)удалите или закомментируйте строку "npdate = CDate(InputBox(......" ;
2)замените 3 строки ниже на эти
d = Format(Date, "dd")
m = Format(Date, "mm")
y = Format(Date, "yyyy").
Еще большое спасибо pashulka - который научил меня VBA
Ну и немного лепты внесу со своей стороны:
Поясните, может я что то не то делаю, скопировал текст макроса в редактор Visual Basic, закрыл его, захожу в MS Excel, нажимаю ALT+F8, появляется окно Макрос, ввожу имя GetDollar? меня выбрасывает обратно в VBA и появляется тот скопированный макрос, что не так? Все, спасибо, разобрался, оказывается порядковые номера убрать и наименование задать было)
Примеры получения данных, используя XML с сайта ЦБР есть здесь:
Как минимум существенная экономия трафика, если нужно загрузить множество котировок на разные даты, и скорость работы быстрее, с XML удобнее работать чем с текстом
функция CBR() и макрос "Курсы ЦБ" из Plex используют немного другой метод поиска курса валют, но также основываются на парсинге html кода:
при данном подходе не получается загрузить курсы белорусского рубля на 01.02.2011 (и множество других дат, когда курс указан шестью знаками, а не семью)
Думаю, лучше использовать загрузку курсов через XML, а не html.
Стандарт получения данных через XML не будут менять при очередной смене дизайна сайта.
Для юаней можно использовать:
outstr = Mid(htmlcode, InStr(1, htmlcode, "USD") + 47, 7) для USD
outstr = Mid(htmlcode, InStr(1, htmlcode, "EUR") + 41, 7) для Евро
Никак не разберусь как прописатьв макрос курс доллара к тенге с
Подскажите пожалуйста.
Сайт вне всяких похвал, многое почерпнул и использую, но так как уровень мой не высок некоторые вещи не получаются.
Попробовал сделать функцию по примеру
Может кто подскажет:
Заранее при много благодарен.
пробовал, не получилось, почему-то не работает такой вариант:
Буду признателен, если внесёте правки!
Подправил макрос в статье и приложенном файле - теперь все ОК.
В связи с новым дизайном сайта ЦБ обновите статью? )
Но как прописать так, чтобы не вылетало окошко, а молча брал дату из ячейки?
Подскажите, есть макрос, работает на ура, но курс загружает только на рабочие дни, а мне нужен курс на все даты, что изменить в макросе?
Option Explicit
Public Sub Auto_Open()
If MsgBox("Загрузить курсы валют?", vbQuestion Or vbYesNo) = vbYes Then
FillRates
End If
End Sub
Public Function RangeCurrencies_() As Excel.Range
Set RangeCurrencies_ = ThisWorkbook.Names("currencies").RefersToRange
End Function
Public Function RangeRates_() As Excel.Range
Set RangeRates_ = ThisWorkbook.Names("rates").RefersToRange
End Function
Public Sub FillRates()
Dim dateFrom As Long, dateTo As Long
Dim codeCBRF As String
Dim calcMode As Excel.XlCalculation
Dim idx As Long
calcMode = Application.Calculation
Application.Calculation = xlCalculationManual
dateFrom = ThisWorkbook.Names("startDate").RefersToRange.Value
dateTo = dateFrom + RangeRates_.Rows.Count - 1
For idx = 2 To RangeCurrencies_.Cells.Count
FillRates_ dateFrom, dateTo, RangeCurrencies_.Cells(idx, 2), RangeRates_(1, 1), RangeRates_(1, idx)
Next
Application.Calculation = calcMode
End Sub
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Private Sub FillRates_(nDateFrom As Long, nDateTo As Long, sCBRFCurCode As String, _
rngDateBeg As Excel.Range, rngValueBeg As Excel.Range)
#If Win32 Or Win64 Then
Const sRecDateConst As String = "<Record Date="
Const sValueBegConst As String = "<Value>"
Const sValueEndConst As String = "</Value>"
Dim nCount As Long
Dim oHttp As Object
Dim sUrl As String, sXML As String
Dim sRateValue As String, sDate As String
Dim fRate As Double, nDate As Long
Dim nPos As Long, nLeftPos As Long, nRightPos As Long
RangeRates_.Worksheet.Range(rngDateBeg, rngDateBeg.Offset(RangeRates_.Rows.Count - 1, 0)).ClearContents
RangeRates_.Worksheet.Range(rngValueBeg, rngValueBeg.Offset(RangeRates_.Rows.Count - 1, 0)).ClearContents
nCount = 0
On Error GoTo Err_
sUrl = "http://www.cbr.ru/scripts/XML_dynamic.asp?date_req1=" & Format(nDateFrom, "dd\/mm\/yyyy") & _
"&date_req2=" & Format(nDateTo, "dd\/mm\/yyyy") & _
"&VAL_NM_RQ=" & sCBRFCurCode
On Error Resume Next
Set oHttp = CreateObject("MSXML2.XMLHTTP")
If Err.Number <> 0 Then
Set oHttp = CreateObject("MSXML.XMLHTTPRequest")
End If
If oHttp Is Nothing Then GoTo Err_
On Error GoTo Err_
oHttp.Open "GET", sUrl, False
oHttp.Send
sXML = oHttp.responseText
Set oHttp = Nothing
nPos = 1
Do
nLeftPos = InStr(nPos, sXML, sRecDateConst)
If (nLeftPos <= 0) Then Exit Do
sDate = Mid(sXML, nLeftPos + Len(sRecDateConst) + 1, 10)
nDate = DateSerial(CLng(Right(sDate, 4)), CLng(Mid(sDate, 4, 2)), CLng(Left(sDate, 2)))
nPos = nLeftPos + Len(sRecDateConst) + 10
nLeftPos = InStr(nPos, sXML, sValueBegConst) + Len(sValueBegConst)
nRightPos = InStr(nLeftPos, sXML, sValueEndConst)
sRateValue = Mid(sXML, nLeftPos, nRightPos - nLeftPos)
fRate = CDbl(sRateValue)
rngDateBeg.Offset(nCount, 0) = nDate
rngValueBeg.Offset(nCount, 0) = fRate
nCount = nCount + 1
Loop
Exit Sub
Err_:
MsgBox "Ошибка при загрузке курсов.", vbOKOnly Or vbExclamation
#Else ' Mac?
MsgBox "Операция не поддерживается.", vbOKOnly Or vbExclamation
#End If
End Sub
При запросе USD выдал - 0[/td]
При запросе EUR выдал - 8[/td]
Что не так?
Или надо что-то подправить?
помоигте с УЗБбанком
можно видео поставить тоже
Как прочитал выше, вероятно это связано с изменением дизайна сайта
Правильно ли я рассуждаю?