Страницы: 1
RSS
макрос не подставляет курсы валют при корректной ссылке на веб-сервис
 
Добрый день.
на просторах интернета нашел файл с командой подтягивания курса валюты на определенную дату.
при запуске макроса веб сервис подтягивается корректный, но в нужные ячейки курс не подтягивается.
у меня 2016  ексель, разделитель между целыми и дробными запятая.
Подскажите где содержи(а)тся ошибка(и)?
Код
Public SelectedDate As String, DefaultDate As StringPublic dt_1 As Date, dt_2 As Date
Option Explicit
Sub GetRates()


Dim sURL As String
Dim objHttp As Object
Dim sHtmlCode As String
Dim varInpDate As Variant
Dim WshShell As Object
Dim RegValue As String
Dim sDay As String, sMonth As String, sYear As String
Dim sDollarRate As String, sEuroRate As String, sYuanRate As String, sPoundRate As String
    'varInpDate = InputBox("Введите дату в формате ДД.ММ.ГГГГ", "Курсы валют", Date)
    Form_SelectDate.Show
    varInpDate = CStr(SelectedDate)
    If varInpDate = "" Then Exit Sub
    varInpDate = CDate(varInpDate)
    sDay = Format(varInpDate, "dd")
    sMonth = Format(varInpDate, "mm")
    sYear = Format(varInpDate, "yyyy")
    sURL = "http://www.nationalbank.kz/rss/get_rates.cfm?fdate=" & _
            sDay & "." & sMonth & "." & sYear & "&switch=kazakh"
    On Error Resume Next
    Set objHttp = CreateObject("MSXML2.XMLHTTP.3.0")
    If Err.Number <> 0 Then
        Err.Clear
        Set objHttp = CreateObject("MSXML2.XMLHTTP")
        If Err.Number <> 0 Then
            Set objHttp = CreateObject("MSXML.XMLHTTPRequest")
        End If
    End If
    If objHttp Is Nothing Then
        MsgBox "Невозможно создать объект для подключения к интернет!", 48, "Ошибка"
        Exit Sub
    End If
    If objHttp Is Nothing Then Exit Sub
    objHttp.Open "GET", sURL, False
    On Error Resume Next
    objHttp.Send
    If Err.Number <> 0 Then
        MsgBox "Отсутствует доступ в интернет!", 48, "Ошибка"
        Exit Sub
    End If
    On Error GoTo 0
    sHtmlCode = objHttp.responseText
    Set objHttp = Nothing
    On Error Resume Next
    sDollarRate = Mid(sHtmlCode, InStr(InStr(1, sHtmlCode, "USD"), sHtmlCode, "</td></tr>") - 7, 7)
    sEuroRate = Mid(sHtmlCode, InStr(InStr(1, sHtmlCode, "EUR"), sHtmlCode, "</td></tr>") - 7, 7)
    sHtmlCode = ""
    '-------------------------------------------------------------------------------
    'считываем значение ключа реестра
    'HKEY_CURRENT_USER\Control Panel\International\\sMonDecimalSep
    'чтобы узнать какой знак является разделителем целой и дробной части
    'указанной в Панель управления - Язык и региональные стандарты -
    'Настройка - Денежная единица - Разделитель целой и дробной части
    Set WshShell = CreateObject("WScript.Shell")
    RegValue = WshShell.RegRead("HKEY_CURRENT_USER\Control Panel\International\\sMonDecimalSep")
    If RegValue = "." Then
        sDollarRate = CSng(Replace(sDollarRate, ",", "."))
        sEuroRate = CSng(Replace(sEuroRate, ",", "."))
    End If
    '-------------------------------------------------------------------------------
    Application.ScreenUpdating = False
    [DollarRng] = ""
    [EuroRng] = ""
    [DateRng] = varInpDate
    [DollarRng] = Replace(sDollarRate, ",", ".")
    [EuroRng] = Replace(sEuroRate, ",", ".")
    ActiveSheet.Hyperlinks.Add Anchor:=Range("LinkRng"), Address:=sURL, _
            ScreenTip:="Перейти на сайт НБ РК", TextToDisplay:="НБ РК"
    Application.ScreenUpdating = True
    MsgBox Format(varInpDate, "DD MMMM YYYY") & Chr(13) & Chr(13) _
            & "Доллар: " & vbTab & sDollarRate & Chr(13) & "Евро: " & vbTab & sEuroRate & Chr(13) _
            & "Отношение: " & Format(sEuroRate / sDollarRate, "0.0000"), 64, "Курсы валют"
End Sub
Код
 
Цитата
adike написал: Подскажите где содержи(а)тся ошибка(и)?
Здесь
Код
sDollarRate = Mid(sHtmlCode, InStr(InStr(1, sHtmlCode, "USD"), sHtmlCode, "</td></tr>") - 7, 7)
sEuroRate = Mid(sHtmlCode, InStr(InStr(1, sHtmlCode, "EUR"), sHtmlCode, "</td></tr>") - 7, 7)

откройте XML валют из кода
там нет искомого "[/td][/tr]" после USD, евро это тоже касается.
 
Спасибо за подсказку.
Удалил "</td></tr>". курсы не подставляет.
заменил на </title>, также не подставляет.
Подскажите правильный синтаксис.
 
Код
sDollarRate = Mid(sHtmlCode, InStr(InStr(1, sHtmlCode, "USD"), sHtmlCode, "</description>") - 6, 6)
sEuroRate = Mid(sHtmlCode, InStr(InStr(1, sHtmlCode, "EUR"), sHtmlCode, "</description>") - 6, 6)

но со временем возможно придется менять 6 на другое число. сейчас там число из 6 символов.
почитайте про ф-цию InStr (в экселе ф-ция ПОИСК)
Изменено: V - 28.09.2018 11:32:18
 
Спасибо, большое. работает!
 
Все же есть где ломается.
Если число после запятой содержит 1 число, то перед числом появляется ">".
Если число после запятой содержит 0 чисел, то перед числом появляется "on>".
то есть , курс всегда состоит из 6 символов с кусочком от "</description>"

Как количество символов сделать переменным?
данная ошибка отображается, если выбрать 21.09.2018
Изменено: adike - 28.09.2018 11:57:37
 
Ребята, помогите поменять жесткое число 6 на переменную
в коде:
Код
sDollarRate = Mid(sHtmlCode, InStr(InStr(1, sHtmlCode, "USD"), sHtmlCode, "</description>") - 6, 6)
sEuroRate = Mid(sHtmlCode, InStr(InStr(1, sHtmlCode, "EUR"), sHtmlCode, "</description>") - 6, 6)
в XML отображается так:
Код
<item><fullname>ДОЛЛАР США</fullname>
<title>USD</title>
<description>361.82</description>
<quant>1</quant>
<index>UP</index>
<change>+2.06</change>

</item>


<item>
<fullname>ЕВРО</fullname>
<title>EUR</title>
<description>423.51</description>
<quant>1</quant>
<index>UP</index>
<change>+0.25</change>

</item>
иногда после <description> курс может состоять от 3 до 6 символов.
Изменено: adike - 28.09.2018 13:04:44
 
проверяйте.
вместо этих двух строчек вставьте это
Код
Set regEx = CreateObject("VBScript.RegExp")
    regEx.Pattern = "\d+.\d+"
    regEx.Global = True
    sDollarRate = Mid(sHtmlCode, InStr(1, sHtmlCode, "USD"), 50)
    sEuroRate = Mid(sHtmlCode, InStr(1, sHtmlCode, "EUR"), 50)
    If regEx.Test(sDollarRate) Then Set matches = regEx.Execute(sDollarRate): sDollarRate = matches.Item(0)
    If regEx.Test(sEuroRate) Then Set matches = regEx.Execute(sEuroRate): sEuroRate = matches.Item(0)

и вверху объявите переменные
Dim matches As Object
Dim regEx As Object
 
Доброе время суток
Цитата
V написал:
и вверху объявите переменные
Коллега а не проще ли использовать xml структуру, используя XPath? Например, если бы xml был на диске, то получить значение USD можно так
Код
Public Sub testXml()
    Dim pDoc As New MSXML2.DOMDocument60, pNode As MSXML2.IXMLDOMElement
    pDoc.Load "C:\Path\get_rates.xml"
    Set pNode = pDoc.SelectSingleNode("/rates/item[title='USD']/description")
    If Not pNode Is Nothing Then Debug.Print pNode.Text
End Sub

Если отдача из интернета, то инициализация будет
Код
pDoc.loadXML objHttp.responseText
 
Андрей VG, знания VBA поверхностные. Ждал что асы ответят, но т.к. ответа не было решил соорудить кое что. :)
 
Цитата
V написал:
решил соорудить кое что
Спасибо, это похвально - тренировка никогда не помешает. Просто для меня тема XPath на форуме как бы уже истоптана вдоль и поперёк. По мне странно, что начинают разбирать xml другим способом, тем более в таком простом случае.
Изменено: Андрей VG - 28.09.2018 16:14:32
 
Посмотрите точно такую же тему для другой страны.
Владимир
 
Я подшаманил одну UDF.
А в общем случае нужно учесть, что иногда бывают ещё и делители! (см. ИРАНСКИЙ РИАЛ)
Изменено: Hugo - 28.09.2018 22:56:29
 
всем большое спасибо. обошел ошибку непосредственно  на самом листе ексель. Есть скрытый лист, в который сливается все, что помогает работать основным листам, туда же слил ячейки с курсом валют, а на основной лист формулой перетащил курс без ошибок.
Страницы: 1
Наверх