Is there a way to get Excel 2007+ to refresh a web query automatically? Scenario : I create a spreadsheet. Select Data/From Web. Type in the address of a web service that I know returns a valid response, select the returned xml and the data appears in Excel. However, when selecting the data just imported, clicking on Data/Connections/Properties and ticking ‘Refresh Every 1 Minutes’, the spreadsheet does not refresh every minute as it should — it does not refresh at all. However, the data can be refreshed by manually right clicking and selecting refresh. This is not the case for data that is imported from a database using a DSN to connect, it only happens for data from the web.
asked Apr 4, 2011 at 14:10
Load 6 more related questions
Show fewer related questions
Хотели ли вы когда-нибудь включить данные из интернет-ресурсов в ваши таблицы 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»). У нас должна получиться следующая таблица:
Так как мой компьютер воспринимает в качестве разделителя дробной части только точку (.), немного подправим формулу, возвращающую курс валют.
Итак, у нас есть статичная таблица изменения курса доллара к рублю за период с 7/08/2013 по 13/08/2013. Так как наша первоначальная задача была – динамическое обновление данных, нам потребуется заменить жестко зафиксированные даты в строке запроса на формулу, которая бы изменяла свое значение в зависимости от текущей даты.
Установим в качестве второго аргумента значение сегодняшней даты плюс один день (т.к. Центробанк устанавливает курс на следующий день), первый аргумент будет равняться второму аргументу минус 6 дней. Зададим обе эти даты в качестве первого и второго аргументов в нашей строке запроса.
Добавим немного красоты для наглядности, теперь вы точно будете знать, когда начинать сливать валюту)
Стоит отметить, что данную функцию можно применять для импорта данных с любых веб служб, предоставляющих свои 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.
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)
Однако в этом случае надо в функции все же добавлять Application.Volatile для надежности.
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 как решение Решение
что никак не связано с изменениями в данных интернета Понятно. Просто Вы и в первом сообщении не указали, что хотите обновлять именно при изменении данных в интернет и далее по тексту тоже. Звучало только при открытии листа. По факту, это естественным образом нереально, т.к. это достигается только постоянным запросом в интернет.
1 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
12.02.2015, 12:26 |
Помогаю со студенческими работами здесь Не обновляет данные в бд yii2 webmaster.yandex.ru не обновляет данные Не обновляет данные в таблице (UPDATE) Биндинг в DataGrid не обновляет данные Не добавляет и не обновляет данные в базе PHP PDO не обновляет данные в MySQL public… Искать еще темы с ответами Или воспользуйтесь поиском по форуму: 8 |
Группа: Пользователи Ранг: Новичок Сообщений: 36
Замечаний: |
Проблема вернулась
Через несколько часов, опять показывается это злочастное «подключение к веб-узлу» и виснет на минуту. Каждый раз, без исключений.
На другом компьютере, на котором была та же проблема, я в тоже время снял галочку, проверил, убедился что всё нормально и больше не пользовался. Сейчас проверяю — на нем этой проблемы до сих пор нет.
Попробовал изменять адрес страницы с http на https, попробовал добавить домен сайта в список Надежных сайсов IE — не помогло. Подключаются оба компьютера с одного модема, так что проблема вряд ли в подключении.