Вебслужба excel не работает

Excel для Microsoft 365 Excel 2021 Excel 2019 Excel 2016 Excel 2013 Еще…Меньше

Функция ВЕБСЛУЖБА возвращает данные из веб-службы в Интернете или интрасети.

Примечания: 

  • Функция ВЕБСЛУЖБА доступна только в Excel 2013 г. и более поздних Windows.

  • Функция ВЕБСЛУЖБА может отображаться в коллекции Excel для Mac, но она использует Windows операционных систем, поэтому она не возвращает результаты на компьютере Mac.

Синтаксис

ВЕБСЛУЖБА(URL-адрес)

Аргумент функции ВЕБСЛУЖБА имеет следующий аргумент:

Аргумент

Описание

url   

Обязательно

URL-адрес веб-службы, которая будет называться

Примечания: 

  • Если аргументы не могут вернуть данные, вебСЛУЖБА возвращает #VALUE! ошибку «#ВЫЧИС!».

  • Если аргументы возвращают строку, которая не является допустимой или содержит больше допустимого ограничения в 32767 символов, вебСЛУЖБА возвращает #VALUE! ошибку «#ВЫЧИС!».

  • Если URL-адрес — это строка, которая содержит больше символов, чем 2048 символов, разрешенных для запроса GET, ВЕБСЛУЖБА возвращает #VALUE! ошибку «#ВЫЧИС!».

  • Для протоколов, которые не поддерживаются, например ftp:// или file://, веб#VALUE! ошибку «#ВЫЧИС!».

Пример

Вот пример использования вымышлеемой веб-службы:

=ВЕБСЛУЖБА(«http://mywebservice.com/serviceEndpoint?searchString=Exce»)

Советы: 

  • Для лучших результатов ПЕРЕД включением в формулу URL-адрес ВЕБСЛУЖБЫ должен быть закодирован.

  • Чтобы кодировать URL-адрес, используйте функцию КОДЕОД.URL. Затем со ссылкой на ячейку в формуле ВЕБСЛУЖБА в кодированном URL-адресе.

Дополнительные сведения

Вы всегда можете задать вопрос специалисту Excel Tech Community или попросить помощи в сообществе Answers community.

См. также

Функция КОДИР.URL

Функция ФИЛЬТР.XML

Нужна дополнительная помощь?

 

Vsevolod

Пользователь

Сообщений: 485
Регистрация: 31.03.2016

#1

12.07.2018 19:18:37

Всем привет
Есть URL который я пытаюсь дергать через функцию Webservice. Все работало, пока в переменной longURL не стали появляться переменные типа ? &
Я значение данной переменной завернул в encodeURL и после этого функция webservice стала возвращать ошибку.
Если убрать encodeURL(нельзя) — то значения & и ? в URL передаваемом будут восприниматься как разделители отдельных переменных.
Подскажите плиз, что я делаю не так, почему WEBSERVICE не воспринимает URL кодированный. Спасибо!

Код
  http://api.bit.ly/shorten?longUrl=domain.ru%2F%3F1%3D1%262%3D2&login=login&apiKey=pass&format=txt

Прикрепленные файлы

  • webservice пример.xlsx (8.9 КБ)

 

sokol92

Пользователь

Сообщений: 4445
Регистрация: 10.09.2017

Вопрос нуждается в уточнении: по указанному в #1 URL браузер возвращает ошибку (INVALID_LOGIN), соответственно, функция Excel также возвращает ошибку.

 

Vsevolod

Пользователь

Сообщений: 485
Регистрация: 31.03.2016

#3

13.07.2018 14:09:53

sokol92, дело не в этом:( webservice функция же не проверяет, что отдает та сторона(я убрал логин и пасс специально).
Смотрите Адрес yandex.ru/?1=1&1=1 что переделать в переменной longURL нужно закодировать, чтобы знаки ? и & сервером не интерпретировались как новая переменная в URL. Так вот при encodeURL адрес становиться такой: yandex.ru%2F%3F1%3D1%261%3D1%0A и уже такой адлрес.

Код
=WEBSERVICE("http://www.domain.ru/?url=yandex.ru%2F%3F1%3D1%261%3D1%0A")  

Даже пример из документации https://support.office.com/en-us/article/encodeurl-function-07c7fb90-7c60-4bff-8687-fac50fe33d0e возвращает просто #Value. Благодарю за помощь!

 

Юрий М

Модератор

Сообщений: 60577
Регистрация: 14.09.2012

Контакты см. в профиле

#4

13.07.2018 14:14:22

Цитата
Vsevolod написал:
тему сам поменять не могу

А Вас об этом просили?

Цитата
vikttur написал:
Уточните название темы

Уточнить — написать прямо здесь новый вариант названия.

 

Vsevolod

Пользователь

Сообщений: 485
Регистрация: 31.03.2016

Юрий М, я так и сделал, всего лишь уточнив — что сам сделать этого не могу.  

 

Vsevolod

Пользователь

Сообщений: 485
Регистрация: 31.03.2016

#6

14.07.2018 08:16:25

webservice победить не удалось, но нашел полезный макрос для сокращения ссылок bitly для excel, может кому понадобится. Задачу решил через макрос

Код
Function bitlyURL(txt As String) As String
    ' base on http://www.jpsoftwaretech.com/shorten-urls-with-bit-ly-web-api-and-vba/
    ' based on http://code.google.com/p/bitly-api/wiki/ApiDocumentation
    Dim xml As Object
    Dim myUserName As String, myApiKey As String
    Dim ApiTarget As String
    
    myUserName = "login"
    myApiKey = "pass"
    
    ApiTarget = "http://api.bit.ly/shorten?version=2.0.1&format=text&login=" & myUserName _
        & "&apiKey=" & myApiKey & "&longUrl=" & txt

    Set xml = CreateObject("MSXML2.XMLHTTP.6.0")
    xml.Open "POST", ApiTarget, False
    xml.Send
 
     bitlyURL = xml.responsetext
End Function

импорт данных вебслужба лого

Хотели ли вы когда-нибудь включить данные из интернет-ресурсов в ваши таблицы Excel, таких как курсы валют, погоду, результаты выдачи поисковиков или даже сообщения Twitter. C новым Excel 2013 такая возможность появилась в виде функции ВЕБСЛУЖБА.

Инструменты импорта данных из интернет были реализованы в более ранних версиях и позволяли выгружать информацию с веб страниц. Функция ВЕБСЛУЖБА возвращает данные на лист в формате XML, из которого в последующем можно выбрать необходимые данные с помощью функции ФИЛЬТР.XML. В сегодняшней статье мы рассмотрим возможность импорта курса доллара за недельный период (думаю, на фоне текущей нестабильной ситуации на рынках, эта информация актуальна для многих), по полученным данным построим график для возможности отслеживания тренда изменений

Для начала, необходимо найти веб сервис, который возвращает данные в формате XML. Я воспользовался службами Центробанка, который любезно предоставляет свои API для выгрузки данных. По ссылке вы найдете все действительные на текущий момент запросы банка.

https://www.cbr.ru/scripts/Root.asp?Prtid=SXML

Так как нас интересует недельный тренд доллара США, ищем динамику котировок, она находится под заголовком Example 2. Если мы щелкнем по ссылке этого примера, сервис вернет нам данные по котировкам доллара за период 01/03/2001 по 14/03/2001 в формате XML. Обратите внимание на адресную строку в браузере, здесь находится строка запроса к сервису (она то нам и нужна!!!) с тремя аргументами: Дата С, Дата ПО и идентификационный номер валюты.

сервис центробанка

Изменяя любой из них, сервис ЦБ будет возвращать нужную нам информацию.

Копируем строку с заголовком, открываем книгу Excel, в ячейку B1 вбиваем функцию =ВЕБСЛУЖБА(), где аргументом функции станет, скопированная нами, строка, т.е. =ВЕБСЛУЖБА("https://www.cbr.ru/scripts/XML_dynamic.asp?date_req1=07/08/2013&date_req2=13/08/2013&VAL_NM_RQ=R01235")

синтаксис функции вебслужба

Обратите внимание, функция ВЕБСЛУЖБА вернула ответ в формате XML, такой же как мы видели в браузере. Теперь с полученного ответа необходимо выбрать нужные нам данные. В этом нам поможет функция ФИЛЬТР.XML, которая использует в качестве аргументов два параметра: первый — XML содержимое, второй – объект Xpath — язык запросов к элементам XML-документа, другими словами, это текстовая строка, которая указывает системе, какие конкретные данные необходимо получить из XML содержимого. Вы можете более подробно прочитать о языке Xpath в статье.

Выделяем ячейки A4:A8, жмем F2, вставляем формулу =ФИЛЬТР.XML(B1; "//Record//@Date") и нажимаем сочетание клавиш Ctrl + Shift + Enter, таким образом у нас получилась формула массива, которая выбирает из веб службы даты изменений курсов валют Центробанком. Таким же образом выделяем соседний диапазон B4:B8 и вставляет туда формулу =ФИЛЬТР.XML(B1;»//Value»). У нас должна получиться следующая таблица:

фильтр.xml формула

Так как мой компьютер воспринимает в качестве разделителя дробной части только точку (.), немного подправим формулу, возвращающую курс валют.

замена запятой на точку

Итак, у нас есть статичная таблица изменения курса доллара к рублю за период с 7/08/2013 по 13/08/2013. Так как наша первоначальная задача была – динамическое обновление данных, нам потребуется заменить жестко зафиксированные даты в строке запроса на формулу, которая бы изменяла свое значение в зависимости от текущей даты.

Установим в качестве второго аргумента значение сегодняшней даты плюс один день (т.к. Центробанк устанавливает курс на следующий день), первый аргумент будет равняться второму аргументу минус 6 дней. Зададим обе эти даты в качестве первого и второго аргументов в нашей строке запроса.

динамическая вебслужба

Добавим немного красоты для наглядности, теперь вы точно будете знать, когда начинать сливать валюту)

график курса доллара excel

Стоит отметить, что данную функцию можно применять для импорта данных с любых веб служб, предоставляющих свои API в свободном доступе. Такими службами являются API Яндекс, Twitter, API Google и т.д.

Скачать файл с примером использования функций ВЕБСЛУЖБА и ФИЛЬТР.XML для выгрузки курса доллара.

0 / 0 / 0

Регистрация: 30.01.2015

Сообщений: 16

1

Функция не обновляет данные из интернета

10.02.2015, 04:18. Показов 2874. Ответов 7


Студворк — интернет-сервис помощи студентам

Здравствуйте, помогите пожалуйста, есть функция скачки курса валют с ЦБР (нашел в нете) присвоена ячейки E8, когда я ее только вводил она благополучно притянула данные из сети, но курс уже поменялся, а значение ячейки не меняется. Задача такая иметь вот такой вот лист при открытии которого я бы видел текущие котировки в той же ячейке. Вчерашний курс 66, для примера чуть ниже я вновь внес формулу E14 — курс 65. Если нажать на E8 и снова интер (то есть перезаписать функцию), то она обновляет, а если ячейку не трогать, то нет, нужен макрос который принудительно обновлял бы данные, то ли еще один макрос, то ли в этом что-то не то.



0



Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

10.02.2015, 04:18

7

1337 / 308 / 74

Регистрация: 13.11.2008

Сообщений: 635

10.02.2015, 11:12

2

Попробуйте добавить в функцию GetEvron строку Application.Volatile, как это сделано для функции GetUSD.
А еще лучше добавьте летучую функцию в каждую из этих:
=GetUSD(СЕГОДНЯ())
=GetEvron(СЕГОДНЯ())



0



0 / 0 / 0

Регистрация: 30.01.2015

Сообщений: 16

10.02.2015, 15:28

 [ТС]

3

Это я добавлял Application.Volatile и это ничего не давало как и замена function на public function



0



1337 / 308 / 74

Регистрация: 13.11.2008

Сообщений: 635

10.02.2015, 15:29

4

А СЕГОДНЯ() не пробовали? Это точно должно сработать. Разницы в результате никакой, но пересчет будет.



0



0 / 0 / 0

Регистрация: 30.01.2015

Сообщений: 16

11.02.2015, 04:50

 [ТС]

5

Попробывал, но результат узнаю завтра. Мне кажется есть другой вариант, и дело в том что у меня есть другие функции которые качают данные с интернета и не привязаны к датам и они тоже спят. Нужно в тело функции ввести автопроверку данных при каждом обращении к листу или книге. Сейчас просто решил переписать фунции на процедуры, вроде работает. Но у меня этих функций много и все их переписывать как-то в лом, я думал, может есть какая комманда одной строкой?



0



The_Prist

1337 / 308 / 74

Регистрация: 13.11.2008

Сообщений: 635

11.02.2015, 11:34

6

Нет никакой команды одной строкой. Если возвращаются числовые данные — то можно для каждой функции дописать нечто вроде +(ТДАТА()*0)
Тогда функции будут пересчитываться при каждом изменении на листе.
Либо макрос напишите, который будет вычислять все Ваши функции. Нечто вроде:

Visual Basic
1
Range("A1:D45").Calculate

Однако в этом случае надо в функции все же добавлять Application.Volatile для надежности.
Можно так же добавить код с Calculate в событие листа/книги Worksheet_Change



0



0 / 0 / 0

Регистрация: 30.01.2015

Сообщений: 16

12.02.2015, 03:45

 [ТС]

7

Нет это не работает, уже проверял, функция просто расчитывается или расчитывается при изменении на самом листе, что никак не связано с изменениями в данных интернета, то есть функция не тянет эти данные. Единственным способ решения было заменить все функции на процедуры и прикрепить их к открытию книги. Так что тема с повестки дня снимается. Я ожидал, что существует некое подобие Application.Volatile но именно для измененийй из сети



0



1337 / 308 / 74

Регистрация: 13.11.2008

Сообщений: 635

12.02.2015, 12:26

8

Лучший ответ Сообщение было отмечено Dmitry Download как решение

Решение

Цитата
Сообщение от Dmitry Download
Посмотреть сообщение

что никак не связано с изменениями в данных интернета

Понятно. Просто Вы и в первом сообщении не указали, что хотите обновлять именно при изменении данных в интернет и далее по тексту тоже. Звучало только при открытии листа. По факту, это естественным образом нереально, т.к. это достигается только постоянным запросом в интернет.



1



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

12.02.2015, 12:26

Помогаю со студенческими работами здесь

Не обновляет данные в бд yii2
При нажатие на кнопку у меня не обновляется статус.
Вот код в вьюшке
<?= Html::a(‘Выполнить’, , …

webmaster.yandex.ru не обновляет данные
Раньше обновлял в течение нескольких дней, а сейчас на 2х сайтах, что в панели даты обновления 17 и…

Не обновляет данные в таблице (UPDATE)
Здравствуйте!
Есть форма, при помощи ajax’a обрабатываю данные. Ajax использует php-обработчик,…

Биндинг в DataGrid не обновляет данные
Когда меняю значение у ком бокса и проверяю Перечень2, а он как был false так и остался при…

Не добавляет и не обновляет данные в базе
в общем ситуация такая, вроде выполняет все без ошибок, но в базу не добавляет и не обновляет. Не…

PHP PDO не обновляет данные в MySQL
Приветствую форумчане. Не могу понять, почему следующий код не обновляет в MySQL данные

public…

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:

8

Хочу в Экселе в ячейку через API Binance.com получить данные о текущей цене BTC:

=ВЕБСЛУЖБА("https://api.binance.com/api/v3/ticker/price?symbol=BTCUSDT")

Данные с двумя параметрами получаю:
62f7dd3b781b6365620036.png

Далее через =ФИЛЬТР.XML пытаюсь получить второй параметр с ценой из данной ячейки:
=ФИЛЬТР.XML(A1;"//price")
и нифига не работает:
62f7de2f384e6203156484.png

Пробовал ложить всё в одном запросе:

=ФИЛЬТР.XML(ВЕБСЛУЖБА("https://api.binance.com/api/v3/ticker/price?symbol=BTCUSDT");"//price")

Пробовал менять второй агрумент функции, после гуглёжки в интернете, почему-то где-то с косыми пишут агрумент, где-то с собачкой, где-то с косыми и собачкой:

=ФИЛЬТР.XML(ВЕБСЛУЖБА("https://api.binance.com/api/v3/ticker/price?symbol=BTCUSDT");"//price")
=ФИЛЬТР.XML(ВЕБСЛУЖБА("https://api.binance.com/api/v3/ticker/price?symbol=BTCUSDT");"@price")
=ФИЛЬТР.XML(ВЕБСЛУЖБА("https://api.binance.com/api/v3/ticker/price?symbol=BTCUSDT");"//@price")

По итогу ни один вариант не работает. Что я делаю не так, в чём ошибка?

Like this post? Please share to your friends:
  • Вебслужба excel не обновляет
  • Ведение документооборота в excel
  • Вебинары по excel бесплатно
  • Ведение документации в excel
  • Вебинар по программе excel