我可以从Excel VBA Web查询中获取流吗?

时间:2011-08-12 13:24:21

标签: excel vba excel-web-query

我正在使用Excel VBA的WebQuery,使用类似于此示例的内容: (这个例子实际上是从这里复制粘贴的:http://support.microsoft.com/kb/213730我正在使用不同的URL和不同的POST参数)

Sub URL_Post_Query()

With ActiveSheet.QueryTables.Add(Connection:= _
    "URL;http://webservices.pcquote.com/cgi-bin/excel.exe", _
    Destination:=Range("a1"))

    .PostText = _
        "QUOTE0=[""QUOTE0"",""Enter up to 20 symbols separated " & _
              "by spaces.""]"

   .BackgroundQuery = True
    .TablesOnlyFromHTML = True
    .Refresh BackgroundQuery:=False
    .SaveData = True
End With
End Sub

我需要能够进行特别大的查询(例如,假设我获得了20,000个证券的股票价格信息),当我这样做时,Excel“锁定”并且不显示任何进展虽然查询确实成功完成,但它仍在工作。

使用这种语法,是否有任何方法可以访问数据流,因为它正在进入?这有助于两种方式:我可以在收到数据时以较小的块处理数据,我可以创建一个进度表来显示给用户。

感谢。

3 个答案:

答案 0 :(得分:1)

如果你想要更多的控制,你可以从web查询切换到类似于使用xmlhttp的实例:这可以异步使用(不是超级简单,但非常可行):

http://www.dailydoseofexcel.com/archives/2006/10/09/async-xmlhttp-calls/

请注意,无法保证当您发送大块符号时,webservice会单独返回每个符号的响应:服务器通常会缓冲内容,直到整个响应完成。

您可能最好将报价分成多个请求,每个请求的符号数量较少。

答案 1 :(得分:1)

如果要完全访问Web调用的结果,可以将URL作为另一个工作簿而不是使用Web查询打开。

请参阅我对此问题的回答:How can I post-process the data from an Excel web query when the query is complete?

这种方法的权衡是你必须管理你自己得到的数据 - Excel不会把它放在给定的目的地。但听起来这可能对你好吗?

这是一个同步通话,但你确实得到了一个进度条,所以用户体验更好。

在我们尝试了与你似乎一直非常相似的事情后,我们最终走上了这条路线。

答案 2 :(得分:0)

如果您正在使用大型XML文档,那么您可能会发现通过SAX而不是DOM处理结果会使事情不那么容易冻结。您可能会发现this answer与相关问题有用

相关问题