Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Функции (UDF) "Курс_Доллара" и "Курс_Евро" - Страница 2 - Мир MS Excel

Старая форма входа
  • Страница 2 из 4
  • «
  • 1
  • 2
  • 3
  • 4
  • »
Модератор форума: _Boroda_, китин  
Мир MS Excel » Вопросы и решения » Готовые решения » Функции (UDF) "Курс_Доллара" и "Курс_Евро" (Возвращают в ячейку курсы USD и EUR с сервера ЦБ РФ)
Функции (UDF) "Курс_Доллара" и "Курс_Евро"
Алексей Дата: Среда, 10.07.2013, 15:42 | Сообщение № 21
Группа: Гости
Огромнейшее СПАСИБО!!!!
 
Ответить
СообщениеОгромнейшее СПАСИБО!!!!

Автор - Алексей
Дата добавления - 10.07.2013 в 15:42
Poltava Дата: Среда, 10.07.2013, 15:49 | Сообщение № 22
Группа: Друзья
Ранг: Форумчанин
Сообщений: 232
Репутация: 50 ±
Замечаний: 0% ±

Мне стало интересно где собака зарыта! немного покопался и вот что удалось узнать.
Функции работают правильно и возвращают значение с четырьмя цифрами после запятой, коллапс происходит во время записи данных в ячейку! причем от версии офиса это никак не зависит (проверил на 2003-2007) если быть более конкретно то проблема в этих строках
[vba]
Код
Target.Offset(, 1) = Ex_Rate_EUR(Target)
Target.Offset(, 2) = Ex_Rate_USD(Target)
[/vba]
Насколько я понимаю причиной данного безобразия является то что функции возвращают данные типа Currency предназначенные для денежных вычислений, а при попытке записать эти данные в ячейку эксель как бы понимает что речь идет о деньгах и приводит их к своему (наверное стандартному для него) двузначному формату.
Первое что пришло в голову это попробовать изменить формат данных с помощью функции format выглядело это примерно так
[vba]
Код
Target.Offset(, 1) = Format(Ex_Rate_EUR(Target), "#,##0.0000р.")
[/vba]
Но в этом случае возвращается текстовое значение, а не назначается формат ячейки хотя иногда это может быть и полезно!
Вторым очевидным решением было заменить тип данных возвращаемых функцией с Currency на Double в данном случае на первый взгляд все стало работать корректно.
PS: да немного опоздал с ответом
PSPS: по поводу авто вставки. Запишите макроредактором ваши формулы и потом настройте чтобы макрос вставлял их при добавлении даты


Сообщение отредактировал Poltava - Среда, 10.07.2013, 15:54
 
Ответить
СообщениеМне стало интересно где собака зарыта! немного покопался и вот что удалось узнать.
Функции работают правильно и возвращают значение с четырьмя цифрами после запятой, коллапс происходит во время записи данных в ячейку! причем от версии офиса это никак не зависит (проверил на 2003-2007) если быть более конкретно то проблема в этих строках
[vba]
Код
Target.Offset(, 1) = Ex_Rate_EUR(Target)
Target.Offset(, 2) = Ex_Rate_USD(Target)
[/vba]
Насколько я понимаю причиной данного безобразия является то что функции возвращают данные типа Currency предназначенные для денежных вычислений, а при попытке записать эти данные в ячейку эксель как бы понимает что речь идет о деньгах и приводит их к своему (наверное стандартному для него) двузначному формату.
Первое что пришло в голову это попробовать изменить формат данных с помощью функции format выглядело это примерно так
[vba]
Код
Target.Offset(, 1) = Format(Ex_Rate_EUR(Target), "#,##0.0000р.")
[/vba]
Но в этом случае возвращается текстовое значение, а не назначается формат ячейки хотя иногда это может быть и полезно!
Вторым очевидным решением было заменить тип данных возвращаемых функцией с Currency на Double в данном случае на первый взгляд все стало работать корректно.
PS: да немного опоздал с ответом
PSPS: по поводу авто вставки. Запишите макроредактором ваши формулы и потом настройте чтобы макрос вставлял их при добавлении даты

Автор - Poltava
Дата добавления - 10.07.2013 в 15:49
M73568 Дата: Среда, 10.07.2013, 16:00 | Сообщение № 23
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 197
Репутация: 46 ±
Замечаний: 0% ±

2007-2013
Может это от винды зависит? У меня на работе ХР, при этом даже меняя системные настройки для денежных единиц, и параллельно настройки экселя на вывод 4 цифр после запятой, всё равно округляет до двух знаков и после дополняет нулями до четырёх sad

ЗЫ Дома проверю на семёрке


Сообщение отредактировал M73568 - Среда, 10.07.2013, 16:00
 
Ответить
СообщениеМожет это от винды зависит? У меня на работе ХР, при этом даже меняя системные настройки для денежных единиц, и параллельно настройки экселя на вывод 4 цифр после запятой, всё равно округляет до двух знаков и после дополняет нулями до четырёх sad

ЗЫ Дома проверю на семёрке

Автор - M73568
Дата добавления - 10.07.2013 в 16:00
Alex_ST Дата: Среда, 10.07.2013, 16:18 | Сообщение № 24
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3206
Репутация: 609 ±
Замечаний: 0% ±

2003
Поменяйте строчку в макросе
[vba]
Код
Private Function Ex_Rate_USD(Optional ByVal Дата) As Currency
[/vba]на[vba]
Код
Private Function Ex_Rate_USD(Optional ByVal Дата) As Single
[/vba]И будет Вам щастье.

Ну, вообще-то переменная, определённая As Currency, может принимать значения от -922337203685477,5808 до 922337203685477,5807
Так что это тут ни при чём. Тем более, что у меня всё работает правильно.
Скорее всего всё-таки от версии Excel'я зависит.



С уважением,
Алексей
MS Excel 2003 - the best!!!


Сообщение отредактировал Alex_ST - Среда, 10.07.2013, 16:46
 
Ответить
Сообщение
Поменяйте строчку в макросе
[vba]
Код
Private Function Ex_Rate_USD(Optional ByVal Дата) As Currency
[/vba]на[vba]
Код
Private Function Ex_Rate_USD(Optional ByVal Дата) As Single
[/vba]И будет Вам щастье.

Ну, вообще-то переменная, определённая As Currency, может принимать значения от -922337203685477,5808 до 922337203685477,5807
Так что это тут ни при чём. Тем более, что у меня всё работает правильно.
Скорее всего всё-таки от версии Excel'я зависит.

Автор - Alex_ST
Дата добавления - 10.07.2013 в 16:18
M73568 Дата: Среда, 10.07.2013, 16:55 | Сообщение № 25
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 197
Репутация: 46 ±
Замечаний: 0% ±

2007-2013
Да, я в курсе, и простая трассировка показывает что функции возвращают именно 4 знака после запятой, но вот при присвоении значения конкретной ячейке эксель почему-то округляет до двух знаков после запятой. Со значениями в формате Single\Double этого не происходит.
 
Ответить
СообщениеДа, я в курсе, и простая трассировка показывает что функции возвращают именно 4 знака после запятой, но вот при присвоении значения конкретной ячейке эксель почему-то округляет до двух знаков после запятой. Со значениями в формате Single\Double этого не происходит.

Автор - M73568
Дата добавления - 10.07.2013 в 16:55
M73568 Дата: Среда, 10.07.2013, 17:11 | Сообщение № 26
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 197
Репутация: 46 ±
Замечаний: 0% ±

2007-2013
Ещё вот такая замена помогает решить проблему с количеством знаков
Эти строчки
[vba]
Код
Target.Offset(, 1) = Ex_Rate_EUR(Target)
Target.Offset(, 2) = Ex_Rate_USD(Target)
[/vba]
заменить на эти
[vba]
Код
Target.Offset(, 1) = FormatCurrency(Ex_Rate_EUR(Target), 4) * 1
Target.Offset(, 2) = FormatCurrency(Ex_Rate_USD(Target), 4) * 1
[/vba]

Тогда тип возвращаемой функции можно оставить Currency

ЗЫ Очень похоже на танцы с бубнами wink


Сообщение отредактировал M73568 - Среда, 10.07.2013, 17:11
 
Ответить
СообщениеЕщё вот такая замена помогает решить проблему с количеством знаков
Эти строчки
[vba]
Код
Target.Offset(, 1) = Ex_Rate_EUR(Target)
Target.Offset(, 2) = Ex_Rate_USD(Target)
[/vba]
заменить на эти
[vba]
Код
Target.Offset(, 1) = FormatCurrency(Ex_Rate_EUR(Target), 4) * 1
Target.Offset(, 2) = FormatCurrency(Ex_Rate_USD(Target), 4) * 1
[/vba]

Тогда тип возвращаемой функции можно оставить Currency

ЗЫ Очень похоже на танцы с бубнами wink

Автор - M73568
Дата добавления - 10.07.2013 в 17:11
ilikeread Дата: Пятница, 02.08.2013, 13:36 | Сообщение № 27
Группа: Пользователи
Ранг: Участник
Сообщений: 56
Репутация: 1 ±
Замечаний: 0% ±

Excel 2010
Всем привет.

Спасибо AlexST за такую фишку.

Подскажите только как эту функцию интегрировать в PERSONAL, чтобы работало в любой книге?

Простое создание модуля, не помогает, функция не появляется.
 
Ответить
СообщениеВсем привет.

Спасибо AlexST за такую фишку.

Подскажите только как эту функцию интегрировать в PERSONAL, чтобы работало в любой книге?

Простое создание модуля, не помогает, функция не появляется.

Автор - ilikeread
Дата добавления - 02.08.2013 в 13:36
ShAM Дата: Суббота, 03.08.2013, 23:27 | Сообщение № 28
Группа: Друзья
Ранг: Старожил
Сообщений: 1347
Репутация: 249 ±
Замечаний: 0% ±

Excel 2010
Вот эту тему посмотрите:
http://www.excelworld.ru/forum/2-1108-1#12419
 
Ответить
СообщениеВот эту тему посмотрите:
http://www.excelworld.ru/forum/2-1108-1#12419

Автор - ShAM
Дата добавления - 03.08.2013 в 23:27
ilikeread Дата: Среда, 07.08.2013, 00:57 | Сообщение № 29
Группа: Пользователи
Ранг: Участник
Сообщений: 56
Репутация: 1 ±
Замечаний: 0% ±

Excel 2010
ShAM,
Спасибо помогло.
 
Ответить
СообщениеShAM,
Спасибо помогло.

Автор - ilikeread
Дата добавления - 07.08.2013 в 00:57
MCH Дата: Вторник, 27.08.2013, 15:54 | Сообщение № 30
Группа: Админы
Ранг: Старожил
Сообщений: 2003
Репутация: 751 ±
Замечаний: ±

Недавно самому потребовалась обновлялка курсов валют, данную тему не видел, поэтому изобретал велосипед.
Обновление происходит не по каждой дате в отдельности, а сразу диапазоном, если нужны курсы за год или за несколько лет, позволяет сэкономить трафик.
Можно загрузить/обновить данные или дополнить с последней известной до завтрешней даты.
Список курсов валют загружается на отдельный лист, нужный курс можно потом проВПРить.

Если чего накосячил - сообщите
К сообщению приложен файл: 3980167.xls (74.0 Kb)
 
Ответить
СообщениеНедавно самому потребовалась обновлялка курсов валют, данную тему не видел, поэтому изобретал велосипед.
Обновление происходит не по каждой дате в отдельности, а сразу диапазоном, если нужны курсы за год или за несколько лет, позволяет сэкономить трафик.
Можно загрузить/обновить данные или дополнить с последней известной до завтрешней даты.
Список курсов валют загружается на отдельный лист, нужный курс можно потом проВПРить.

Если чего накосячил - сообщите

Автор - MCH
Дата добавления - 27.08.2013 в 15:54
Alex_ST Дата: Вторник, 27.08.2013, 16:46 | Сообщение № 31
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3206
Репутация: 609 ±
Замечаний: 0% ±

2003
Миш,
к сожалению, на работе файлы с макросами скачивать не дают, а дома не до сукг :)



С уважением,
Алексей
MS Excel 2003 - the best!!!
 
Ответить
СообщениеМиш,
к сожалению, на работе файлы с макросами скачивать не дают, а дома не до сукг :)

Автор - Alex_ST
Дата добавления - 27.08.2013 в 16:46
MCH Дата: Вторник, 27.08.2013, 17:16 | Сообщение № 32
Группа: Админы
Ранг: Старожил
Сообщений: 2003
Репутация: 751 ±
Замечаний: ±

к сожалению, на работе файлы с макросами скачивать не дают

Даже если они (файлы) будут в архиве, или в другом расширении (xlsb например) и тп?
 
Ответить
Сообщение
к сожалению, на работе файлы с макросами скачивать не дают

Даже если они (файлы) будут в архиве, или в другом расширении (xlsb например) и тп?

Автор - MCH
Дата добавления - 27.08.2013 в 17:16
Alex_ST Дата: Вторник, 27.08.2013, 17:21 | Сообщение № 33
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3206
Репутация: 609 ±
Замечаний: 0% ±

2003
Суки-сисадмины умудряются просто удалять программные модули из Excel-файлов, а архивы при попытке загрузки кричат: "Файл заражён! Загрузка запрещена"



С уважением,
Алексей
MS Excel 2003 - the best!!!
 
Ответить
СообщениеСуки-сисадмины умудряются просто удалять программные модули из Excel-файлов, а архивы при попытке загрузки кричат: "Файл заражён! Загрузка запрещена"

Автор - Alex_ST
Дата добавления - 27.08.2013 в 17:21
MCH Дата: Вторник, 27.08.2013, 17:29 | Сообщение № 34
Группа: Админы
Ранг: Старожил
Сообщений: 2003
Репутация: 751 ±
Замечаний: ±

Ну тогда могу предложить опубликовать здесь код, если файл скачивается, а макросов в нем нет:
[vba]
Код
Option Explicit

Sub GetRateUSDandEUR(Date1 As Date, Date2 As Date, outRange As Range)
      'макрос загрузки курсов USD и EUR с сайта www.cbr.ru
      'автор Михаил Ч. (MCH), август 2013
      Dim i&, len1&, len2&, url_addr$, url_request1$, url_request2$, outArr()
      Dim xmldoc1, xmldoc2, nodeList1, nodeList2, xmlNode1, xmlNode2

      On Error Resume Next
      Set xmldoc1 = CreateObject("Msxml.DOMDocument"): xmldoc1.async = False
      Set xmldoc2 = CreateObject("Msxml.DOMDocument"): xmldoc2.async = False
        
      url_addr = "http://www.cbr.ru/scripts/XML_dynamic.asp?date_req1=" & Format(Date1, "dd\/mm\/yyyy") & "&date_req2=" & Format(Date2, "dd\/mm\/yyyy")
      url_request1 = url_addr & "&VAL_NM_RQ=R01235"
      url_request2 = url_addr & "&VAL_NM_RQ=R01239"
            
      If xmldoc1.Load(url_request1) <> True Or xmldoc2.Load(url_request2) <> True Then Exit Sub 'Запрос к серверу ЦБР
        
      Set nodeList1 = xmldoc1.SelectNodes("*/Record"): len1 = nodeList1.Length
      Set nodeList2 = xmldoc2.SelectNodes("*/Record"): len2 = nodeList2.Length
      If len1 <> len2 Or len1 = 0 Then Exit Sub
        
      ReDim outArr(1 To len1, 1 To 3)
      For i = 0 To len1
          Set xmlNode1 = nodeList1.Item(i).CloneNode(True)
          Set xmlNode2 = nodeList2.Item(i).CloneNode(True)
          outArr(i + 1, 1) = CDate(xmlNode1.Attributes(0).Text)
          outArr(i + 1, 2) = CDbl(xmlNode1.ChildNodes(1).Text)
          outArr(i + 1, 3) = CDbl(xmlNode2.ChildNodes(1).Text)
          'Debug.Print xmlNode1.Attributes(0).Text, xmlNode1.childNodes(1).Text, xmlNode2.childNodes(1).Text
      Next i

      outRange.ClearContents
      outRange.Resize(len1, 3) = outArr
End Sub

Sub GetRate()
      On Error Resume Next
      GetRateUSDandEUR CDate([Date1]), CDate([Date2]), [outRange]
End Sub

Sub GetNewRate() 'дополнить котировки с последней известной до завтрашней даты
      Dim d1 As Date
      On Error Resume Next
      d1 = Application.Max([outRange].Columns(1)) + 1 'узнаем максимально известную дату
      If d1 = 1 Then d1 = CDate([Date1]) 'если дат нет, то берем Date1
      GetRateUSDandEUR d1, Now + 1, [outRange].Resize(1, 1).Offset(Application.Count([outRange].Columns(1)), 0)
End Sub
[/vba]

В книге объявлены имена, на которые ссылается макрос:
Date1 - начальная дата,
Date2 - конечная дата,
outRange - диапазон куда производится выгрузка


Сообщение отредактировал MCH - Вторник, 27.08.2013, 17:50
 
Ответить
СообщениеНу тогда могу предложить опубликовать здесь код, если файл скачивается, а макросов в нем нет:
[vba]
Код
Option Explicit

Sub GetRateUSDandEUR(Date1 As Date, Date2 As Date, outRange As Range)
      'макрос загрузки курсов USD и EUR с сайта www.cbr.ru
      'автор Михаил Ч. (MCH), август 2013
      Dim i&, len1&, len2&, url_addr$, url_request1$, url_request2$, outArr()
      Dim xmldoc1, xmldoc2, nodeList1, nodeList2, xmlNode1, xmlNode2

      On Error Resume Next
      Set xmldoc1 = CreateObject("Msxml.DOMDocument"): xmldoc1.async = False
      Set xmldoc2 = CreateObject("Msxml.DOMDocument"): xmldoc2.async = False
        
      url_addr = "http://www.cbr.ru/scripts/XML_dynamic.asp?date_req1=" & Format(Date1, "dd\/mm\/yyyy") & "&date_req2=" & Format(Date2, "dd\/mm\/yyyy")
      url_request1 = url_addr & "&VAL_NM_RQ=R01235"
      url_request2 = url_addr & "&VAL_NM_RQ=R01239"
            
      If xmldoc1.Load(url_request1) <> True Or xmldoc2.Load(url_request2) <> True Then Exit Sub 'Запрос к серверу ЦБР
        
      Set nodeList1 = xmldoc1.SelectNodes("*/Record"): len1 = nodeList1.Length
      Set nodeList2 = xmldoc2.SelectNodes("*/Record"): len2 = nodeList2.Length
      If len1 <> len2 Or len1 = 0 Then Exit Sub
        
      ReDim outArr(1 To len1, 1 To 3)
      For i = 0 To len1
          Set xmlNode1 = nodeList1.Item(i).CloneNode(True)
          Set xmlNode2 = nodeList2.Item(i).CloneNode(True)
          outArr(i + 1, 1) = CDate(xmlNode1.Attributes(0).Text)
          outArr(i + 1, 2) = CDbl(xmlNode1.ChildNodes(1).Text)
          outArr(i + 1, 3) = CDbl(xmlNode2.ChildNodes(1).Text)
          'Debug.Print xmlNode1.Attributes(0).Text, xmlNode1.childNodes(1).Text, xmlNode2.childNodes(1).Text
      Next i

      outRange.ClearContents
      outRange.Resize(len1, 3) = outArr
End Sub

Sub GetRate()
      On Error Resume Next
      GetRateUSDandEUR CDate([Date1]), CDate([Date2]), [outRange]
End Sub

Sub GetNewRate() 'дополнить котировки с последней известной до завтрашней даты
      Dim d1 As Date
      On Error Resume Next
      d1 = Application.Max([outRange].Columns(1)) + 1 'узнаем максимально известную дату
      If d1 = 1 Then d1 = CDate([Date1]) 'если дат нет, то берем Date1
      GetRateUSDandEUR d1, Now + 1, [outRange].Resize(1, 1).Offset(Application.Count([outRange].Columns(1)), 0)
End Sub
[/vba]

В книге объявлены имена, на которые ссылается макрос:
Date1 - начальная дата,
Date2 - конечная дата,
outRange - диапазон куда производится выгрузка

Автор - MCH
Дата добавления - 27.08.2013 в 17:29
Alex_ST Дата: Вторник, 27.08.2013, 19:43 | Сообщение № 35
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3206
Репутация: 609 ±
Замечаний: 0% ±

2003
Из дома качнул на Яндекс.Диск
Его наши коцать не умеют.
Попробую на работе найти время, не закрутиться, не забыть и посмотреть (видите, сколько условий должно совпасть?) :)



С уважением,
Алексей
MS Excel 2003 - the best!!!
 
Ответить
СообщениеИз дома качнул на Яндекс.Диск
Его наши коцать не умеют.
Попробую на работе найти время, не закрутиться, не забыть и посмотреть (видите, сколько условий должно совпасть?) :)

Автор - Alex_ST
Дата добавления - 27.08.2013 в 19:43
MCH Дата: Суббота, 31.08.2013, 04:58 | Сообщение № 36
Группа: Админы
Ранг: Старожил
Сообщений: 2003
Репутация: 751 ±
Замечаний: ±

Вариант функций через XML запрос с сайта ЦБР
[vba]
Код
Function GetUSD(Optional ByVal MyDate As Date) As Double
      Dim xmldoc, nodeList
      If MyDate = 0 Then MyDate = Date
      On Error Resume Next
      Set xmldoc = CreateObject("Msxml.DOMDocument"): xmldoc.async = False
      If Not xmldoc.Load("http://www.cbr.ru/scripts/XML_daily.asp?date_req=" & Format(MyDate, "dd\/mm\/yyyy")) Then Exit Function
      Set nodeList = xmldoc.SelectNodes("//Valute[@ID='R01235']")
      If nodeList.Length Then GetUSD = CDbl(nodeList.Item(0).ChildNodes(4).Text)
End Function
[/vba]
[vba]
Код
Function GetEUR(Optional ByVal MyDate As Date) As Double
      Dim xmldoc, nodeList
      If MyDate = 0 Then MyDate = Date
      On Error Resume Next
      Set xmldoc = CreateObject("Msxml.DOMDocument"): xmldoc.async = False
      If Not xmldoc.Load("http://www.cbr.ru/scripts/XML_daily.asp?date_req=" & Format(MyDate, "dd\/mm\/yyyy")) Then Exit Function
      Set nodeList = xmldoc.SelectNodes("//Valute[@ID='R01239']")
      If nodeList.Length Then GetEUR = CDbl(nodeList.Item(0).ChildNodes(4).Text)
End Function
[/vba]


Сообщение отредактировал MCH - Суббота, 31.08.2013, 04:59
 
Ответить
СообщениеВариант функций через XML запрос с сайта ЦБР
[vba]
Код
Function GetUSD(Optional ByVal MyDate As Date) As Double
      Dim xmldoc, nodeList
      If MyDate = 0 Then MyDate = Date
      On Error Resume Next
      Set xmldoc = CreateObject("Msxml.DOMDocument"): xmldoc.async = False
      If Not xmldoc.Load("http://www.cbr.ru/scripts/XML_daily.asp?date_req=" & Format(MyDate, "dd\/mm\/yyyy")) Then Exit Function
      Set nodeList = xmldoc.SelectNodes("//Valute[@ID='R01235']")
      If nodeList.Length Then GetUSD = CDbl(nodeList.Item(0).ChildNodes(4).Text)
End Function
[/vba]
[vba]
Код
Function GetEUR(Optional ByVal MyDate As Date) As Double
      Dim xmldoc, nodeList
      If MyDate = 0 Then MyDate = Date
      On Error Resume Next
      Set xmldoc = CreateObject("Msxml.DOMDocument"): xmldoc.async = False
      If Not xmldoc.Load("http://www.cbr.ru/scripts/XML_daily.asp?date_req=" & Format(MyDate, "dd\/mm\/yyyy")) Then Exit Function
      Set nodeList = xmldoc.SelectNodes("//Valute[@ID='R01239']")
      If nodeList.Length Then GetEUR = CDbl(nodeList.Item(0).ChildNodes(4).Text)
End Function
[/vba]

Автор - MCH
Дата добавления - 31.08.2013 в 04:58
Alex_ST Дата: Суббота, 31.08.2013, 19:56 | Сообщение № 37
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3206
Репутация: 609 ±
Замечаний: 0% ±

2003
На работе жуткий завал...
Спасибо, Миша, что напомнил о моём намерении проверить.
Извини за задержку.
Проверил дома.
ОТЛИЧНО и коротко.
Только я не понял, откуда берётся код валюты для бакса [@ID='R01235'] , а для евро [@ID='R01239']?
Это какое-то табличное значение, наверное?
Тогда это - единственный недостаток твоего кода по сравнению с моим: нельзя сделать универсальную функцию, запрашивающую курс любой валюты по её стандартному условному обозначению.
Я не помню, кажется на старой Планете выкладывал такую универсальную функцию.
(выдрал As Is из своего Personal.xls вместе с комментариями и пояснениями, оставленными для себя когда разбирал код уважаемого ZVI)


А ещё есть другой вариант от EducatedFool

Нельзя ли как-то в твоём методе вычислять нужное значение [@ID='R0????'] по коду валюты?



С уважением,
Алексей
MS Excel 2003 - the best!!!
 
Ответить
СообщениеНа работе жуткий завал...
Спасибо, Миша, что напомнил о моём намерении проверить.
Извини за задержку.
Проверил дома.
ОТЛИЧНО и коротко.
Только я не понял, откуда берётся код валюты для бакса [@ID='R01235'] , а для евро [@ID='R01239']?
Это какое-то табличное значение, наверное?
Тогда это - единственный недостаток твоего кода по сравнению с моим: нельзя сделать универсальную функцию, запрашивающую курс любой валюты по её стандартному условному обозначению.
Я не помню, кажется на старой Планете выкладывал такую универсальную функцию.
(выдрал As Is из своего Personal.xls вместе с комментариями и пояснениями, оставленными для себя когда разбирал код уважаемого ZVI)


А ещё есть другой вариант от EducatedFool

Нельзя ли как-то в твоём методе вычислять нужное значение [@ID='R0????'] по коду валюты?

Автор - Alex_ST
Дата добавления - 31.08.2013 в 19:56
MCH Дата: Суббота, 31.08.2013, 22:38 | Сообщение № 38
Группа: Админы
Ранг: Старожил
Сообщений: 2003
Репутация: 751 ±
Замечаний: ±

Только я не понял, откуда берётся код валюты для бакса [@ID='R01235'] , а для евро [@ID='R01239']?

А это внутренние кодировки валют на cbr, весь справочник можно посмотреть здесь: http://www.cbr.ru/scripts/XML_val.asp?d=0

А ещё есть другой вариант от EducatedFool

Я как раз заинтересовалься вариантом через XML, подсмотрев код Игоря, только у него там есть лишние строчки, совершенно не нужные в коде (о чем я там и написал).
Хорошее описание по объектной модели XML есть здесь: http://www.script-coding.com/XMLDOMscripts.html

Нельзя ли как-то в твоём методе вычислять нужное значение [@ID='R0????'] по коду валюты?

Коды валют можно засунуть в массив, либо как в коде Игоря, перебрать каждое поле в XML, сравнив с трехбуквенным обозначением
 
Ответить
Сообщение
Только я не понял, откуда берётся код валюты для бакса [@ID='R01235'] , а для евро [@ID='R01239']?

А это внутренние кодировки валют на cbr, весь справочник можно посмотреть здесь: http://www.cbr.ru/scripts/XML_val.asp?d=0

А ещё есть другой вариант от EducatedFool

Я как раз заинтересовалься вариантом через XML, подсмотрев код Игоря, только у него там есть лишние строчки, совершенно не нужные в коде (о чем я там и написал).
Хорошее описание по объектной модели XML есть здесь: http://www.script-coding.com/XMLDOMscripts.html

Нельзя ли как-то в твоём методе вычислять нужное значение [@ID='R0????'] по коду валюты?

Коды валют можно засунуть в массив, либо как в коде Игоря, перебрать каждое поле в XML, сравнив с трехбуквенным обозначением

Автор - MCH
Дата добавления - 31.08.2013 в 22:38
MCH Дата: Суббота, 31.08.2013, 22:53 | Сообщение № 39
Группа: Админы
Ранг: Старожил
Сообщений: 2003
Репутация: 751 ±
Замечаний: ±

Немного сокращенная функция на базе варианта EducatedFool (кстати, он ее не сам писал, а где-то взял):
[vba]
Код
Function GetRate(ByVal CurrencyName As String, Optional ByVal RateDate As Date) As Double
     Dim i&, xmldoc, nodeList, xmlNode
     On Error Resume Next
     If Len(CurrencyName) <> 3 Then Exit Function Else CurrencyName = UCase(CurrencyName)
     If RateDate = 0 Then RateDate = Date
     Set xmldoc = CreateObject("Msxml.DOMDocument"): xmldoc.async = False
     If Not xmldoc.Load("http://www.cbr.ru/scripts/XML_daily.asp?date_req=" & Format(RateDate, "dd\/mm\/yyyy")) Then Exit Function
     Set nodeList = xmldoc.selectNodes("//Valute")
     For i = 0 To nodeList.Length - 1
         Set xmlNode = nodeList.Item(i)
         If xmlNode.childNodes(1).Text = CurrencyName Then
             GetRate = CDbl(xmlNode.childNodes(4).Text) / Val(xmlNode.childNodes(2).Text)
             Exit Function
         End If
     Next i
End Function
[/vba]
Можно использовать в виде
Код
=GetRate("USD")

или
Код
=GetRate("eur";"29.08.2013")
 
Ответить
СообщениеНемного сокращенная функция на базе варианта EducatedFool (кстати, он ее не сам писал, а где-то взял):
[vba]
Код
Function GetRate(ByVal CurrencyName As String, Optional ByVal RateDate As Date) As Double
     Dim i&, xmldoc, nodeList, xmlNode
     On Error Resume Next
     If Len(CurrencyName) <> 3 Then Exit Function Else CurrencyName = UCase(CurrencyName)
     If RateDate = 0 Then RateDate = Date
     Set xmldoc = CreateObject("Msxml.DOMDocument"): xmldoc.async = False
     If Not xmldoc.Load("http://www.cbr.ru/scripts/XML_daily.asp?date_req=" & Format(RateDate, "dd\/mm\/yyyy")) Then Exit Function
     Set nodeList = xmldoc.selectNodes("//Valute")
     For i = 0 To nodeList.Length - 1
         Set xmlNode = nodeList.Item(i)
         If xmlNode.childNodes(1).Text = CurrencyName Then
             GetRate = CDbl(xmlNode.childNodes(4).Text) / Val(xmlNode.childNodes(2).Text)
             Exit Function
         End If
     Next i
End Function
[/vba]
Можно использовать в виде
Код
=GetRate("USD")

или
Код
=GetRate("eur";"29.08.2013")

Автор - MCH
Дата добавления - 31.08.2013 в 22:53
Hunter23071985 Дата: Воскресенье, 27.10.2013, 17:29 | Сообщение № 40
Группа: Пользователи
Ранг: Прохожий
Сообщений: 8
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Отлично, что можно указать вид валюты, т.к. мне нужны USD+EUR+CNY+UAH+UZS.
Но есть 2 проблемы:
1. Курс ЦБ многих валют указан за N штук (CNY/UAH - за 10, UZS - за 1000 и т.д.)
Как их привести к "единому знаменателю" - 1?
2. Можно ли адаптировать UDF для Сбербанка (http://sberbank.ru/kostroma/ru/valkprev/archive_3/)
Использовать "Данные - Импорт из Интернета" + ВПР не удобно, составить запрос на конкретное число нельзя.

Help!


Сообщение отредактировал Hunter23071985 - Воскресенье, 27.10.2013, 17:42
 
Ответить
СообщениеОтлично, что можно указать вид валюты, т.к. мне нужны USD+EUR+CNY+UAH+UZS.
Но есть 2 проблемы:
1. Курс ЦБ многих валют указан за N штук (CNY/UAH - за 10, UZS - за 1000 и т.д.)
Как их привести к "единому знаменателю" - 1?
2. Можно ли адаптировать UDF для Сбербанка (http://sberbank.ru/kostroma/ru/valkprev/archive_3/)
Использовать "Данные - Импорт из Интернета" + ВПР не удобно, составить запрос на конкретное число нельзя.

Help!

Автор - Hunter23071985
Дата добавления - 27.10.2013 в 17:29
Мир MS Excel » Вопросы и решения » Готовые решения » Функции (UDF) "Курс_Доллара" и "Курс_Евро" (Возвращают в ячейку курсы USD и EUR с сервера ЦБ РФ)
  • Страница 2 из 4
  • «
  • 1
  • 2
  • 3
  • 4
  • »
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!