Выполнение веб-запроса с параметром из ячейки в Excel - PullRequest
0 голосов
/ 02 мая 2018

Я пытаюсь выполнить запрос GET при изменении значения в ячейке.

Ссылка здесь:

https://www.aviationweather.gov/adds/dataserver_current/httpparam?dataSource=metars&requestType=retrieve&format=xml&stationString=(PARAMETER SHOULD BE HERE)&hoursBeforeNow=1

Итак, что находится в этой ячейке, следует изменить этот запрос. Возможно ли это, и если да, есть ли у кого-нибудь хорошее решение для этого? Я пытался гуглить всю ночь, но не могу найти никого, кто сделал бы то же самое. enter image description here

1 Ответ

0 голосов
/ 02 мая 2018

Адаптация от этого ответа , это двухэтапный процесс.

Во-первых, создайте именованный диапазон для ячейки, в которой хранится значение, которое вы передадите в запрос. Подробности о том, как это сделать, здесь . Я использовал «StationName» в качестве имени диапазона, но вы можете использовать любое имя, которое вам нравится.

Во-вторых, нам нужно включить именованный диапазон в источник запроса. Для этого:

  • выбрать любую ячейку в таблице данных из текущего запроса
  • нажмите на вкладку «Запрос» на ленте
  • нажмите на Edit
  • найдите панель «Настройки запроса» в правой части экрана - если ее там нет, перейдите в «Просмотр» и нажмите «Настройки запроса»
  • первая запись на панели «Параметры запроса» должна быть «Источник» - щелкните по этой записи, чтобы выбрать ее
  • убедитесь, что панель формул отображается, перейдя в View, затем проверив Formula Bar
  • запись в строке формул слишком длинна для отображения, поэтому нажмите на символ V в конце строки формул, чтобы развернуть ее
  • измените текст строки формулы на текст, показанный ниже - не забудьте изменить имя диапазона Excel, показанное в Name="StationName", на любое имя, которое вы использовали

= Xml.Tables(Web.Contents("https://www.aviationweather.gov/adds/dataserver_current/httpparam?dataSource=metars&requestType=retrieve&format=xml&stationString=" & Excel.CurrentWorkbook(){[Name="StationName"]}[Content]{0}[Column1] & "&hoursBeforeNow=1"))

Эта картинка показывает, как все должно выглядеть:

The Excel Power Query formula bar showing the formula: = Xml.Tables(Web.Contents(

Теперь перейдите в «Домой» и нажмите «Закрыть и загрузить».

Вы можете получить предупреждение о настройках конфиденциальности - чтобы исправить это, я решил предоставить как файлу Excel, так и сайту aviationweather.gov "публичный" уровень конфиденциальности.

Вы можете получить доступ к настройкам конфиденциальности, выбрав ячейку в таблице данных, перейдя в Query и выбрав Edit, перейдя в Home и выбрав Настройки источника данных, выбрав Global Permissions и затем используя Edit Permissions для соответствующих записей.

Чтобы запрос автоматически обновлялся при изменении значения ячейки, нам нужно использовать некоторый VBA. Нам нужно знать, на каком листе находится ячейка, имя именованного диапазона, который ссылается на эту ячейку, и имя запроса, который мы хотим обновить. Первые два должны быть простыми, а имя запроса просто «Query -», за которым следует имя, отображаемое на панели «Запросы и соединения».

Откройте редактор VBA с помощью ALT-F11, дважды щелкните соответствующий объект листа в Project Explorer, чтобы открыть соответствующий модуль кода, и вставьте следующий код (но измените имя именованного диапазона и имя запроса на совпадение ваших имен):

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)

If Not Application.Intersect(Target, ThisWorkbook.Names("StationName").RefersToRange) _
    Is Nothing And Target.Cells.Count = 1 Then
    Application.EnableEvents = False
    ThisWorkbook.Connections("Query - Get station from aviationweather dot gov").Refresh
    Application.EnableEvents = True
End If

End Sub

Теперь изменение значения ячейки должно привести к автоматическому обновлению запроса


Вот простой код для перечисления имени каждого соединения в рабочей книге. В редакторе VBA используйте «Вставка»> «Модуль», чтобы создать новый модуль, а затем вставьте следующий код:

Option Explicit

Sub listConnections()

Dim c As WorkbookConnection

For Each c In ThisWorkbook.Connections
    MsgBox c.Name
Next c

End Sub

Каждое имя подключения будет отображаться в окне сообщения, например:

An Excel message box with the text: Query - Get station from aviationweather dot gov

и вы можете просто скопировать нужное имя, когда оно появится. Вы можете скопировать содержимое окна сообщения, просто нажав CTRL-C, но вам нужно будет отредактировать некоторые дополнительные элементы при вставке. При копировании окна сообщения, показанного выше, в буфер обмена помещается следующий текст:

---------------------------
Microsoft Excel
---------------------------
Query - Get station from aviationweather dot gov
---------------------------
OK   
---------------------------
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...