Спасибо! Действительно GetRate работает правильно. Но запрос через Msxml.DOMDocument (GetRate) почему-то медленнее XMLHTTPRequest: 9,26631079002982 сек. против 7,30688379073399 на 120 запросов. Это всегда так?
И что делать со Сбербанком - у них XML-сервиса вообще нет.
Спасибо! Действительно GetRate работает правильно. Но запрос через Msxml.DOMDocument (GetRate) почему-то медленнее XMLHTTPRequest: 9,26631079002982 сек. против 7,30688379073399 на 120 запросов. Это всегда так?
И что делать со Сбербанком - у них XML-сервиса вообще нет.Hunter23071985
Сообщение отредактировал Hunter23071985 - Воскресенье, 27.10.2013, 19:35
Даты-валюты часто повторяются? Если да - то можно результаты загонять в публичный словарь и брать уже вытянутое из словаря. Можно вообще при первом вызове определённой даты загонять все валюты в словарь (или подготовить список всех нужных валют) - тогда будет только столько обращений к банку, сколько разных дат (а не сколько формул на листе).
Даты-валюты часто повторяются? Если да - то можно результаты загонять в публичный словарь и брать уже вытянутое из словаря. Можно вообще при первом вызове определённой даты загонять все валюты в словарь (или подготовить список всех нужных валют) - тогда будет только столько обращений к банку, сколько разных дат (а не сколько формул на листе).Hugo
Игорь, браво! Можно вообще хранить единожды считанный массив данных где-то в файле, например, в его свойствах (или вообще в диапазоне на шибко спрятанной странице), а при открытии файла выводить запрос "Обновить?"
Игорь, браво! Можно вообще хранить единожды считанный массив данных где-то в файле, например, в его свойствах (или вообще в диапазоне на шибко спрятанной странице), а при открытии файла выводить запрос "Обновить?"Alex_ST
Можно обновлять словарь с листа молча при открытии файла. Когда станут заметны тормоза - зайти на этот лист и удалить явно уже ненужные данные (например за прошлые годы). Или например при открытии сперва удалять устаревшие данные (например задать период то же год), затем загружать словарь. Далее дополняем новыми данными лист и словарь. Конечно реализация требует работы - поэтому не ждите тут вот прямо сейчас этой реализации... Но может кому-то это актуально, или времени много... Хотя я в одном проекте (в макросе) так словарь уже использовал - как ключ валюта|дата, в Item кладём курс. Когда нужен курс - сперва ищем в словаре, если не нашли - тянем из банка, заносим в словарь.
Можно обновлять словарь с листа молча при открытии файла. Когда станут заметны тормоза - зайти на этот лист и удалить явно уже ненужные данные (например за прошлые годы). Или например при открытии сперва удалять устаревшие данные (например задать период то же год), затем загружать словарь. Далее дополняем новыми данными лист и словарь. Конечно реализация требует работы - поэтому не ждите тут вот прямо сейчас этой реализации... Но может кому-то это актуально, или времени много... Хотя я в одном проекте (в макросе) так словарь уже использовал - как ключ валюта|дата, в Item кладём курс. Когда нужен курс - сперва ищем в словаре, если не нашли - тянем из банка, заносим в словарь.Hugo
Function КУРС(ByVal Название_курса As String, Optional ByVal ДАТА As Date) As Double Dim i&, xmldoc, nodeList, xmlNode On Error Resume Next If Len(Название_курса) <> 3 Then Exit Function Else Название_курса = UCase(Название_курса) If ДАТА = 0 Then ДАТА = Date Set xmldoc = CreateObject("Msxml.DOMDocument"): xmldoc.async = False If Not xmldoc.Load("http://www.nbrb.by/Services/XmlExRates.aspx?ondate=" & Format(ДАТА, "mm\/dd\/yyyy")) Then Exit Function Set nodeList = xmldoc.SelectNodes("//Currency") For i = 0 To nodeList.Length - 1 Set xmlNode = nodeList.Item(i) If xmlNode.ChildNodes(1).Text = Название_курса Then КУРС = CDbl(xmlNode.ChildNodes(4).Text) / Val(xmlNode.ChildNodes(2).Text) Exit Function End If Next i End Function Function КУРС(ByVal Название_курса As String, Optional ByVal ДАТА As Date) As Double Dim i&, xmldoc, nodeList, xmlNode On Error Resume Next If Len(Название_курса) <> 3 Then Exit Function Else Название_курса = UCase(Название_курса) If ДАТА = 0 Then ДАТА = Date Set xmldoc = CreateObject("Msxml.DOMDocument"): xmldoc.async = False If Not xmldoc.Load("http://www.nbrb.by/Services/XmlExRates.aspx?ondate=" & Format(ДАТА, "mm\/dd\/yyyy")) Then Exit Function Set nodeList = xmldoc.SelectNodes("//Currency") For i = 0 To nodeList.Length - 1 Set xmlNode = nodeList.Item(i) If xmlNode.ChildNodes(1).Text = Название_курса Then КУРС = CDbl(xmlNode.ChildNodes(4).Text) / Val(xmlNode.ChildNodes(2).Text) Exit Function End If Next i End Function
[/vba]
На сайте дата в формате месяц/дата/год. Как сделать запрос в формуле в формате дата/месц/год? [moder]Пользуйтесь тегами оформления. Для кодов макросов кнопка #, для длинных сообщений - спойлер. И нафига две одинаковых функции?
Помогите!!!!!!!!!!!!
[vba]
Код
Function КУРС(ByVal Название_курса As String, Optional ByVal ДАТА As Date) As Double Dim i&, xmldoc, nodeList, xmlNode On Error Resume Next If Len(Название_курса) <> 3 Then Exit Function Else Название_курса = UCase(Название_курса) If ДАТА = 0 Then ДАТА = Date Set xmldoc = CreateObject("Msxml.DOMDocument"): xmldoc.async = False If Not xmldoc.Load("http://www.nbrb.by/Services/XmlExRates.aspx?ondate=" & Format(ДАТА, "mm\/dd\/yyyy")) Then Exit Function Set nodeList = xmldoc.SelectNodes("//Currency") For i = 0 To nodeList.Length - 1 Set xmlNode = nodeList.Item(i) If xmlNode.ChildNodes(1).Text = Название_курса Then КУРС = CDbl(xmlNode.ChildNodes(4).Text) / Val(xmlNode.ChildNodes(2).Text) Exit Function End If Next i End Function Function КУРС(ByVal Название_курса As String, Optional ByVal ДАТА As Date) As Double Dim i&, xmldoc, nodeList, xmlNode On Error Resume Next If Len(Название_курса) <> 3 Then Exit Function Else Название_курса = UCase(Название_курса) If ДАТА = 0 Then ДАТА = Date Set xmldoc = CreateObject("Msxml.DOMDocument"): xmldoc.async = False If Not xmldoc.Load("http://www.nbrb.by/Services/XmlExRates.aspx?ondate=" & Format(ДАТА, "mm\/dd\/yyyy")) Then Exit Function Set nodeList = xmldoc.SelectNodes("//Currency") For i = 0 To nodeList.Length - 1 Set xmlNode = nodeList.Item(i) If xmlNode.ChildNodes(1).Text = Название_курса Then КУРС = CDbl(xmlNode.ChildNodes(4).Text) / Val(xmlNode.ChildNodes(2).Text) Exit Function End If Next i End Function
[/vba]
На сайте дата в формате месяц/дата/год. Как сделать запрос в формуле в формате дата/месц/год? [moder]Пользуйтесь тегами оформления. Для кодов макросов кнопка #, для длинных сообщений - спойлер. И нафига две одинаковых функции?art-dj2011
можно ли подтягивать не курс по ЦБ, а, например, курс покупки и курс продажи именно "Сбера"?
Наверняка можно. Например, на текущий день - ОТСЮДА Вся проблема - в отсутствии свободного времени для выполнения не нужной мне сейчас работы. Но тому, кто хоть немного понимает в VBA, не сложно сделать это и самостоятельно по аналогии с выложенным решением.
можно ли подтягивать не курс по ЦБ, а, например, курс покупки и курс продажи именно "Сбера"?
Наверняка можно. Например, на текущий день - ОТСЮДА Вся проблема - в отсутствии свободного времени для выполнения не нужной мне сейчас работы. Но тому, кто хоть немного понимает в VBA, не сложно сделать это и самостоятельно по аналогии с выложенным решением.Alex_ST
Прошу не судить за ссылку на готовое решение со стороннего форума (надеюсь дружественного этому): http://www.planetaexcel.ru/forum....e476244 UDF позволяет быстро и просто получить курс покупки/продажи на заданную дату с сайтов Сбербанка и ЦБ РФ. В будущем (возможно не столь отдалённом) появится новый интерфейс и функционал.
PS: всех с наступающим!
PPS: при переходе по ссылке в адресной строке заменить & на &. Не знаю, откуда он возникает...
Прошу не судить за ссылку на готовое решение со стороннего форума (надеюсь дружественного этому): http://www.planetaexcel.ru/forum....e476244 UDF позволяет быстро и просто получить курс покупки/продажи на заданную дату с сайтов Сбербанка и ЦБ РФ. В будущем (возможно не столь отдалённом) появится новый интерфейс и функционал.
PS: всех с наступающим!
PPS: при переходе по ссылке в адресной строке заменить & на &. Не знаю, откуда он возникает...Hunter23071985
Сообщение отредактировал Hunter23071985 - Понедельник, 29.12.2014, 21:14
вот функция для получения котировок на металлы Сбербанка 1 атрибут функции обязательный - код металла (1 - золото, 6 - серебро, 28 - платина, 29 - палладий) 2 атрибут необязательный- тип курса банка ("buy" , "sell", по умолчанию "buy") 3 атрибут необязательный - дата в числовом или текстовом формате (по умолчанию текущая системная дата) в качестве разделителей между числами дня, месяца и года может использоваться любой символ из " " , "/" , "." , "-" , "," , запись даты в формате "9 янв 15" и "9 января 2015" тоже корректно распознаются 4 атрибут необязательный - код региона (по умолчанию 223 - Москва) [vba]
Код
Function МетСБР#(CodeMet%, Optional quote$ = "buy", Optional dDate As Date, Optional region% = 223) Dim sc: Set sc = CreateObject("ScriptControl"):dDate = IIf(dDate, dDate, Date):sc.Language = "JScript" sc.AddCode "function getProperty(jsonObj, propertyName) {return jsonObj[propertyName];}" sc.AddCode "function getKeys(jsonObj) {var keys=new Array();for(var i in jsonObj){keys.push(i);}return keys;}" strURL = "http://sbrf.ru/common/js/get_quote_values.php?&inf_block=" & region & "&group=2&_date_afrom114=" _ & dDate & "&_date_ato114=" & dDate & "&qid[]=" & CodeMet Dim XMLhttp: Set XMLhttp = CreateObject("msxml2.xmlhttp"): XMLhttp.Open "POST", strURL, 0: XMLhttp.send МетСБР = sc.Run("getProperty", sc.Run("getProperty", sc.Run("getProperty", _ sc.Run("getProperty", sc.Eval("(" & XMLhttp.responsetext & ")"), CodeMet), _ "quotes"), sc.Run("getKeys", sc.Run("getProperty", sc.Run("getProperty", _ sc.Eval("(" & XMLhttp.responsetext & ")"), CodeMet), "quotes"))), quote) Set XMLhttp = Nothing: Set sc = Nothing End Function
[/vba]
вот функция для получения котировок на металлы Сбербанка 1 атрибут функции обязательный - код металла (1 - золото, 6 - серебро, 28 - платина, 29 - палладий) 2 атрибут необязательный- тип курса банка ("buy" , "sell", по умолчанию "buy") 3 атрибут необязательный - дата в числовом или текстовом формате (по умолчанию текущая системная дата) в качестве разделителей между числами дня, месяца и года может использоваться любой символ из " " , "/" , "." , "-" , "," , запись даты в формате "9 янв 15" и "9 января 2015" тоже корректно распознаются 4 атрибут необязательный - код региона (по умолчанию 223 - Москва) [vba]
Код
Function МетСБР#(CodeMet%, Optional quote$ = "buy", Optional dDate As Date, Optional region% = 223) Dim sc: Set sc = CreateObject("ScriptControl"):dDate = IIf(dDate, dDate, Date):sc.Language = "JScript" sc.AddCode "function getProperty(jsonObj, propertyName) {return jsonObj[propertyName];}" sc.AddCode "function getKeys(jsonObj) {var keys=new Array();for(var i in jsonObj){keys.push(i);}return keys;}" strURL = "http://sbrf.ru/common/js/get_quote_values.php?&inf_block=" & region & "&group=2&_date_afrom114=" _ & dDate & "&_date_ato114=" & dDate & "&qid[]=" & CodeMet Dim XMLhttp: Set XMLhttp = CreateObject("msxml2.xmlhttp"): XMLhttp.Open "POST", strURL, 0: XMLhttp.send МетСБР = sc.Run("getProperty", sc.Run("getProperty", sc.Run("getProperty", _ sc.Run("getProperty", sc.Eval("(" & XMLhttp.responsetext & ")"), CodeMet), _ "quotes"), sc.Run("getKeys", sc.Run("getProperty", sc.Run("getProperty", _ sc.Eval("(" & XMLhttp.responsetext & ")"), CodeMet), "quotes"))), quote) Set XMLhttp = Nothing: Set sc = Nothing End Function
В будущем (возможно не столь отдалённом) появится новый интерфейс и функционал.
Начал делать новую версию файла. Есть проблема с заполнением/чтением базы данных - запинается на If Dic("ToSave") Then... Весь мозг уже сломал - в текстовик выгрузка идёт (!), а в Excel нет. Файл: удалено Очень нужна Ваша помощь!
В будущем (возможно не столь отдалённом) появится новый интерфейс и функционал.
Начал делать новую версию файла. Есть проблема с заполнением/чтением базы данных - запинается на If Dic("ToSave") Then... Весь мозг уже сломал - в текстовик выгрузка идёт (!), а в Excel нет. Файл: удалено Очень нужна Ваша помощь!
Один из аргументов функции - дата. Если завязать на функцию СЕГОДНЯ(), курс будет обновляться при открытии файла.
Пробовал кстати, только после сохранения и снова открытия файла - снова стоит дата. Ах да, там кстати ещё с колонками "купить" и "продать" путаница. ИМХО местами перепутаны, т.к. курс покупки банка для меня не есть "купить", а есть "продать".
Про обезличенный металл - тоже тема. Хорошо если в отдельном листе этой же книги.
Один из аргументов функции - дата. Если завязать на функцию СЕГОДНЯ(), курс будет обновляться при открытии файла.
Пробовал кстати, только после сохранения и снова открытия файла - снова стоит дата. Ах да, там кстати ещё с колонками "купить" и "продать" путаница. ИМХО местами перепутаны, т.к. курс покупки банка для меня не есть "купить", а есть "продать".
Про обезличенный металл - тоже тема. Хорошо если в отдельном листе этой же книги.sercam
Сообщение отредактировал sercam - Воскресенье, 01.02.2015, 17:30