使用Excel中的单元格中的参数运行Web查询

时间:2018-05-01 21:29:28

标签: excel excel-vba excel-formula vba

我在更改单元格中的值时尝试执行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

2 个答案:

答案 0 :(得分:2)

this answer改编,这是一个两步过程。

首先,为存储将传递给查询的值的单元格创建命名范围。有关如何执行此操作的详细信息,请here。我使用" StationName"作为范围的名称,但您可以使用任何您喜欢的名称。

其次,我们需要将命名范围合并到查询的源中。为此:

  • 从当前查询中选择数据表中的任何单元格
  • 单击功能区中的“查询”选项卡
  • 点击编辑
  • 查找屏幕右侧的“查询设置”面板 - 如果不存在,请转到“查看”,然后单击“查询设置”
  • “查询设置”面板中的第一个条目应为“来源” - 单击该条目以将其选中
  • 确保通过转到View然后检查公式栏
  • 来显示公式栏
  • 公式栏中的条目太长而无法显示,因此请单击公式栏末尾的V符号将其展开
  • 将公式栏文本编辑为下面显示的文本 - 确保将Name="StationName"中显示的Excel范围的名称更改为您使用的任何名称

= 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("https://www.aviationweather.gov/adds/dataserver_current/httpparam?dataSource=metars&requestType=retrieve&format=xml&stationString=" & Excel.CurrentWorkbook(){[Name="StationName"]}[Content]{0}[Column1] & "&hoursBeforeNow=1"))

现在转到Home并点击Close&负荷。

您可能会收到有关隐私设置的警告 - 为了解决这个问题,我选择将Excel文件和aviationweather.gov网站同时提供给公众"隐私程度。

您可以通过选择数据表中的单元格,进入查询并选择编辑,转到主页并选择数据源设置,选择全局权限,然后在相关条目上使用编辑权限来访问隐私设置。

要在单元格值更改时自动刷新查询,我们需要使用一些VBA。我们需要知道单元格所在的工作表,引用该单元格的命名范围的名称以及我们要刷新的查询的名称。前两个应该是直截了当的,查询的名称只是"查询 - "然后是Queries&中显示的名称。连接面板。

使用ALT-F11打开VBA编辑器,双击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编辑器中,使用Insert>用于创建新模块的模块,然后粘贴以下代码:

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   
---------------------------

答案 1 :(得分:1)

我以这种方式从cbr.ru获取每日汇率数据。

screenshot of the Connection

http://www.cbr.ru/eng/currency_base/daily/?UniDbQuery.Posted=True&UniDbQuery.To=[“股票行情”]

我将日期用作excel单元格中的变量的方式是,一旦单元格值更改,它就会自动刷新。 (将该参数命名为股票代码)

screenshot of the Parameters

希望这种简单的方法会有所帮助。