2012-07-11 151 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