2012-07-11 132 views
3

为了从Excel中的web服务获取数据,我创建了一个excel插件提供函数来获取它;用户只需要在类型细胞: =sendRequest("http://webservice.com")如何向VBA发送Async XMLHTTP请求?

我有2个Excel文件在于向世人证明了两个sending request方法:1。synchronous和2 asynchronous

sync方法,该功能可以发送请求和normaly获取数据。但是,如果我们有100个,200个单元格称它,它将需要Excel等待大量的时间;这也使得Exel成为而不是重新编码

我给这家目前的解决方案是使用async方法below code

Public Function sendAsyncRequest(URL) 
    'other statement 

    ' Get some stuff asynchronously. 
    xmlHttpRequest.Open "GET", URL, True 
    xmlHttpRequest.send 
    sendAsyncRequest = xmlHttpRequest.responseText 
End Function 

但单元格的值常是是零0而不是repsone文本。

我必须使用我的处理程序类将其与OnReadyStateChangexmlHttpRequest object绑定,以将响应文本设置为单元格。但是,它也清除了单元格的公式。

所以我的问题是如何更改单元格的显示文本而不更改其公式?

我也欢迎另一种解决方案发送请求并获得async方法返回值。

+0

我的答案有一个关键的缺点,绝对不应该被接受。请取消选中它。 – 2012-07-12 12:23:37

回答

1

作为解决方案的缺点说here,该propper的方式来获得异步返回值的功能是1)缓存您的request's url => returned value收集/ dicitonary,然后2)刷新您的公式

1

这是我的solution file为您的问题;确实它是从您的async test file更新的。

基于this discusion,您可以change the display text of cell without changing its formula使用范围(yourCellAddress).NumberFormat = “0 0 0”; “值,显示” “”

所以你的问题,解决的办法是

  1. 在你sendAsyncRequest功能更换回线

    sendAsyncRequest = "anything other than numbers"

  2. 在你ReadyStateChangeHandler子,更换

    Application.Range(cellAddress).Value = XMLHttpReq.responseText 'return responseText to cell

通过

cellDisplayText = XMLHttpReq.responseText 
Range(cellAddress).NumberFormat = "0;0;0;""" & cellDisplayText & """" 
+0

我也在这里重构了一个更好的代码的解决方案https://dl.dropbox.com/u/6194904/2012/TestHttpReqest%20-%20ASync%20-%20NN。xlsm – 2012-07-12 05:51:10

+0

这种解决方案的一个缺点是,我们看到的“显示文本”的值实际上不是单元格值;单元格值是“除数字之外的任何东西”。因此,如果单元格A1的“显示值”为122,并且我们在单元格A2的公式中使用它,比如说“= A1 + 1”,那么值不是123,但会导致错误(由于将字符串添加到数字) – 2012-07-12 12:22:59