Данные Определенные пользователем функции (User-Defined Function или UDF) возвращают в ячейку листа, куда они введены, курсы соответствующих валют на указанную в аргументе дату (по умолчанию - текущий день), получаемые по запросу на сервер ЦБ РФ [vba]
Code
Function Курс_Доллара(Optional ByVal Дата) As Currency ' запрос курса Доллара США с сайта ЦБ РФ '--------------------------------------------------------------------------------------- ' Procedure : Курс_Доллара ' Author : Основа - Pavel55, коррекция - Alex_ST: 2010-01-28 ' URL : http://www.planetaexcel.ru/forum.php?thread_id=6870&page_forum=2&allnum_forum=34 ' Date : 28.01.2010 ' Purpose : Запрос курса Доллара, установленного ЦБР на заданную дату ' Notes : По умолчанию - текущая дата '--------------------------------------------------------------------------------------- Dim Запрос$, Ответ$, Курс$ Dim oHttp As Object Dim ДЕНЬ$, Месяц$, ГОД$ Application.Volatile If IsMissing(Дата) Then Дата = Date If Not IsDate(Дата) Then Дата = CDate(Дата) ДЕНЬ = Format(Дата, "dd"): Месяц = Format(Дата, "mm"): ГОД = Format(Дата, "yyyy") Запрос = "http://cbr.ru/currency_base/daily.aspx?C_month=" & Месяц & "&C_year=" _ & ГОД & "&date_req=" & ДЕНЬ & "%2F" & Месяц & "%2F" & ГОД On Error Resume Next Set oHttp = CreateObject("MSXML2.XMLHTTP") If Err.Number <> 0 Then Set oHttp = CreateObject("MSXML.XMLHTTPRequest") On Error GoTo 0 If oHttp Is Nothing Then Exit Function oHttp.Open "GET", Запрос, False oHttp.Send Ответ = UCase(oHttp.responseText) Курс = CCur(Mid(Ответ, InStr(InStr(1, Ответ, "USD"), Ответ, "</TD></TR>") - 7, 7)) Set oHttp = Nothing Курс_Доллара = Курс End Function
[/vba]
[vba]
Code
Function Курс_Евро(Optional ByVal Дата) As Currency ' запрос курса Евро с сайта ЦБ РФ '--------------------------------------------------------------------------------------- ' Procedure : Курс_Евро ' Author : Основа - Pavel55, коррекция - Alex_ST: 2010-01-28 ' URL : http://www.planetaexcel.ru/forum.php?thread_id=6870&page_forum=2&allnum_forum=34 ' Date : 28.01.2010 ' Purpose : Запрос курса Евро, установленного ЦБР на заданную дату ' Notes : По умолчанию - текущая дата '--------------------------------------------------------------------------------------- Dim Запрос$, Ответ$, Курс$ Dim oHttp As Object Dim ДЕНЬ$, Месяц$, ГОД$ Application.Volatile If IsMissing(Дата) Then Дата = Date If Not IsDate(Дата) Then Дата = CDate(Дата) ДЕНЬ = Format(Дата, "dd"): Месяц = Format(Дата, "mm"): ГОД = Format(Дата, "yyyy") Запрос = "http://cbr.ru/currency_base/daily.aspx?C_month=" & Месяц & "&C_year=" _ & ГОД & "&date_req=" & ДЕНЬ & "%2F" & Месяц & "%2F" & ГОД On Error Resume Next Set oHttp = CreateObject("MSXML2.XMLHTTP") If Err.Number <> 0 Then Set oHttp = CreateObject("MSXML.XMLHTTPRequest") On Error GoTo 0 If oHttp Is Nothing Then Exit Function oHttp.Open "GET", Запрос, False oHttp.Send Ответ = UCase(oHttp.responseText) Курс = CCur(Mid(Ответ, InStr(InStr(1, Ответ, "EUR"), Ответ, "</TD></TR>") - 7, 7)) Set oHttp = Nothing Курс_Евро = Курс End Function
[/vba]
Данные Определенные пользователем функции (User-Defined Function или UDF) возвращают в ячейку листа, куда они введены, курсы соответствующих валют на указанную в аргументе дату (по умолчанию - текущий день), получаемые по запросу на сервер ЦБ РФ [vba]
Code
Function Курс_Доллара(Optional ByVal Дата) As Currency ' запрос курса Доллара США с сайта ЦБ РФ '--------------------------------------------------------------------------------------- ' Procedure : Курс_Доллара ' Author : Основа - Pavel55, коррекция - Alex_ST: 2010-01-28 ' URL : http://www.planetaexcel.ru/forum.php?thread_id=6870&page_forum=2&allnum_forum=34 ' Date : 28.01.2010 ' Purpose : Запрос курса Доллара, установленного ЦБР на заданную дату ' Notes : По умолчанию - текущая дата '--------------------------------------------------------------------------------------- Dim Запрос$, Ответ$, Курс$ Dim oHttp As Object Dim ДЕНЬ$, Месяц$, ГОД$ Application.Volatile If IsMissing(Дата) Then Дата = Date If Not IsDate(Дата) Then Дата = CDate(Дата) ДЕНЬ = Format(Дата, "dd"): Месяц = Format(Дата, "mm"): ГОД = Format(Дата, "yyyy") Запрос = "http://cbr.ru/currency_base/daily.aspx?C_month=" & Месяц & "&C_year=" _ & ГОД & "&date_req=" & ДЕНЬ & "%2F" & Месяц & "%2F" & ГОД On Error Resume Next Set oHttp = CreateObject("MSXML2.XMLHTTP") If Err.Number <> 0 Then Set oHttp = CreateObject("MSXML.XMLHTTPRequest") On Error GoTo 0 If oHttp Is Nothing Then Exit Function oHttp.Open "GET", Запрос, False oHttp.Send Ответ = UCase(oHttp.responseText) Курс = CCur(Mid(Ответ, InStr(InStr(1, Ответ, "USD"), Ответ, "</TD></TR>") - 7, 7)) Set oHttp = Nothing Курс_Доллара = Курс End Function
[/vba]
[vba]
Code
Function Курс_Евро(Optional ByVal Дата) As Currency ' запрос курса Евро с сайта ЦБ РФ '--------------------------------------------------------------------------------------- ' Procedure : Курс_Евро ' Author : Основа - Pavel55, коррекция - Alex_ST: 2010-01-28 ' URL : http://www.planetaexcel.ru/forum.php?thread_id=6870&page_forum=2&allnum_forum=34 ' Date : 28.01.2010 ' Purpose : Запрос курса Евро, установленного ЦБР на заданную дату ' Notes : По умолчанию - текущая дата '--------------------------------------------------------------------------------------- Dim Запрос$, Ответ$, Курс$ Dim oHttp As Object Dim ДЕНЬ$, Месяц$, ГОД$ Application.Volatile If IsMissing(Дата) Then Дата = Date If Not IsDate(Дата) Then Дата = CDate(Дата) ДЕНЬ = Format(Дата, "dd"): Месяц = Format(Дата, "mm"): ГОД = Format(Дата, "yyyy") Запрос = "http://cbr.ru/currency_base/daily.aspx?C_month=" & Месяц & "&C_year=" _ & ГОД & "&date_req=" & ДЕНЬ & "%2F" & Месяц & "%2F" & ГОД On Error Resume Next Set oHttp = CreateObject("MSXML2.XMLHTTP") If Err.Number <> 0 Then Set oHttp = CreateObject("MSXML.XMLHTTPRequest") On Error GoTo 0 If oHttp Is Nothing Then Exit Function oHttp.Open "GET", Запрос, False oHttp.Send Ответ = UCase(oHttp.responseText) Курс = CCur(Mid(Ответ, InStr(InStr(1, Ответ, "EUR"), Ответ, "</TD></TR>") - 7, 7)) Set oHttp = Nothing Курс_Евро = Курс End Function
Уважаемый Alex_ST, вот начал использовать Вашу функцию, все работает хорошо, но возникла проблемка. Прошу Вашей помощи... Значит так... Аргументом для Вашей функции я использую ссылку на ячейку, в которой вводится дата, необходимая для определения курса евро. Изначально тоже не работало корректно, т.к. при пустой ячейке выдавало ошибку =ЗНАЧ.. не корректное значение вводимых данных. Эту неприятность я устранил с помощью проверки ячейки на заполнение ЕСЛИ пусто, то ставить 0, если не пусто, то выполняется Ваша функция... Все заработало отлично, но возникла другая неприятность. Дело в том, что работа с книгой происходит не всегда с постоянным подключением к ИНЕТу, поэтому при каком то изменении значений в какой-то любой формуле происходит обновление и меняются значения во всех формулах и функциях данной книги, соответственно в ячейках, где раньше уже стоял курс евро выдает ошибку =ЗНАЧ.. Как с этим бороться - я не придумал, в excel я пока чайник))) всего как 1 месяц.. как то раньше не заглядывал, но жизнь заставила))) Возможно существуют какие-то встроенные функции для решения этой проблемы, а возможно необходимо дополнить Вашу функцию. Можно ли сделать так, чтобы после отработки Вашей функции в данной ячейке, значение курса евро оставалось константой, при этом при изменениях в других формулах и функциях, установленное значение курса евро уже не менялось, а менялось ТОЛЬКО в том случае, если изменилась дата в ячейке, значение которой является аргументом Вашей функции.(дата, на которую необходимо получить курс валюты) Надеюсь я понятно выразился? ))) Заранее благодарен за Вашу помощь, тезка) Жду Вашего решения с нетерпением. С уважением, Алексей.
Уважаемый Alex_ST, вот начал использовать Вашу функцию, все работает хорошо, но возникла проблемка. Прошу Вашей помощи... Значит так... Аргументом для Вашей функции я использую ссылку на ячейку, в которой вводится дата, необходимая для определения курса евро. Изначально тоже не работало корректно, т.к. при пустой ячейке выдавало ошибку =ЗНАЧ.. не корректное значение вводимых данных. Эту неприятность я устранил с помощью проверки ячейки на заполнение ЕСЛИ пусто, то ставить 0, если не пусто, то выполняется Ваша функция... Все заработало отлично, но возникла другая неприятность. Дело в том, что работа с книгой происходит не всегда с постоянным подключением к ИНЕТу, поэтому при каком то изменении значений в какой-то любой формуле происходит обновление и меняются значения во всех формулах и функциях данной книги, соответственно в ячейках, где раньше уже стоял курс евро выдает ошибку =ЗНАЧ.. Как с этим бороться - я не придумал, в excel я пока чайник))) всего как 1 месяц.. как то раньше не заглядывал, но жизнь заставила))) Возможно существуют какие-то встроенные функции для решения этой проблемы, а возможно необходимо дополнить Вашу функцию. Можно ли сделать так, чтобы после отработки Вашей функции в данной ячейке, значение курса евро оставалось константой, при этом при изменениях в других формулах и функциях, установленное значение курса евро уже не менялось, а менялось ТОЛЬКО в том случае, если изменилась дата в ячейке, значение которой является аргументом Вашей функции.(дата, на которую необходимо получить курс валюты) Надеюсь я понятно выразился? ))) Заранее благодарен за Вашу помощь, тезка) Жду Вашего решения с нетерпением. С уважением, Алексей.CTAPOKOHb
Вообще-то все функции листа, будь то встроенные или функции пользователя - без разницы, всегда обновляются при возникновении событий обновления/пересчёта листа. А эти события возникают при каждом изменении на листе. И запретить какой-то конкретной из них пересчитываться весьма затруднительно. В Вашем случае, наверное, проще всего создать в книге отдельный лист, на котором будут вычисляться (запрашиваться) данные по событию, например, дабл-клика по ячейке с датой. А уж с этого листа взять данные за интересующую Вас дату обычными формулами листа Вы, наверное, сможете самостоятельно.
Вот я набросал пример. Там на листе Ex_Rate дабл-клик по ячейкам с датой в столбце А:А вызывает запрос данных об обменных курсах с сервера ЦБР функциями Ex_Rate_USD и Ex_Rate_EUR. Полученные данные вводятся КАК ЗНАЧЕНИЯ (постоянные) в соседние ячейки. Функции Ex_Rate_USD и Ex_Rate_EUR - это переименованные функции пользователя Курс_Доллара и Курс_Евро (мне просто лень было их переделывать из Fucction в Sub, да и ни к чему это). Коды функций размещены в модуле листа, а сами функции объявлены как Private Function Такое решение совместно с переименованием функций позволило создать код, полностью локализованный на листе. А это значит, что лист Ex_Rate можно свободно копировать (естественно, с помощью диалога "Переместить/Скопировать лист", открывающегося по правому клику на ярлыке листа) в другие книги. Работоспособность макроса и функций должна сохраняться, конфликтов имён функций возникнуть не должно. При желании лист Ex_Rate Вы вполне можете скрыть и обновлять на нём данные будете только сами когда понадобится.
Вообще-то все функции листа, будь то встроенные или функции пользователя - без разницы, всегда обновляются при возникновении событий обновления/пересчёта листа. А эти события возникают при каждом изменении на листе. И запретить какой-то конкретной из них пересчитываться весьма затруднительно. В Вашем случае, наверное, проще всего создать в книге отдельный лист, на котором будут вычисляться (запрашиваться) данные по событию, например, дабл-клика по ячейке с датой. А уж с этого листа взять данные за интересующую Вас дату обычными формулами листа Вы, наверное, сможете самостоятельно.
Вот я набросал пример. Там на листе Ex_Rate дабл-клик по ячейкам с датой в столбце А:А вызывает запрос данных об обменных курсах с сервера ЦБР функциями Ex_Rate_USD и Ex_Rate_EUR. Полученные данные вводятся КАК ЗНАЧЕНИЯ (постоянные) в соседние ячейки. Функции Ex_Rate_USD и Ex_Rate_EUR - это переименованные функции пользователя Курс_Доллара и Курс_Евро (мне просто лень было их переделывать из Fucction в Sub, да и ни к чему это). Коды функций размещены в модуле листа, а сами функции объявлены как Private Function Такое решение совместно с переименованием функций позволило создать код, полностью локализованный на листе. А это значит, что лист Ex_Rate можно свободно копировать (естественно, с помощью диалога "Переместить/Скопировать лист", открывающегося по правому клику на ярлыке листа) в другие книги. Работоспособность макроса и функций должна сохраняться, конфликтов имён функций возникнуть не должно. При желании лист Ex_Rate Вы вполне можете скрыть и обновлять на нём данные будете только сами когда понадобится.Alex_ST
На том файле у меня округляет до 2 знаков (почему не знай), а на сообщении №11 все нормально выгружает. Сделайте уж пожалуйста для файла 1163506.xlsm (см.выше) данную операцию. Очень надо.
На том файле у меня округляет до 2 знаков (почему не знай), а на сообщении №11 все нормально выгружает. Сделайте уж пожалуйста для файла 1163506.xlsm (см.выше) данную операцию. Очень надо.Алексей
Я проверить не могу - мне сисадмины скачивание файлов с макросами закрыли Да и в Офисе старше 2003 я предпочитаю не работать (хоть в принципе и могу, но не хочу)
Я проверить не могу - мне сисадмины скачивание файлов с макросами закрыли Да и в Офисе старше 2003 я предпочитаю не работать (хоть в принципе и могу, но не хочу)Alex_ST
Ну, от меня вряд ли... На работе скачать и разобраться не могу, а дома не программирую, да и Офис там только 2003, а в нем всё работает. Может, кто-нибудь ещё из местных знатоков глянет?
Ну, от меня вряд ли... На работе скачать и разобраться не могу, а дома не программирую, да и Офис там только 2003, а в нем всё работает. Может, кто-нибудь ещё из местных знатоков глянет?Alex_ST
На том файле у меня округляет до 2 знаков (почему не знай), а на сообщении №11 все нормально выгружает. Сделайте уж пожалуйста для файла 1163506.xlsm (см.выше) данную операцию. Очень надо.
Поменяйте строчку в макросе [vba]
Код
Private Function Ex_Rate_USD(Optional ByVal Дата) As Currency
[/vba] на [vba]
Код
Private Function Ex_Rate_USD(Optional ByVal Дата) As Single
[/vba] И будет Вам щастье. Не забудьте формат ячеек поправить на финансовый и число знаков после точки увеличить до 4 в настройке этого формат
На том файле у меня округляет до 2 знаков (почему не знай), а на сообщении №11 все нормально выгружает. Сделайте уж пожалуйста для файла 1163506.xlsm (см.выше) данную операцию. Очень надо.
Поменяйте строчку в макросе [vba]
Код
Private Function Ex_Rate_USD(Optional ByVal Дата) As Currency
[/vba] на [vba]
Код
Private Function Ex_Rate_USD(Optional ByVal Дата) As Single
[/vba] И будет Вам щастье. Не забудьте формат ячеек поправить на финансовый и число знаков после точки увеличить до 4 в настройке этого форматM73568