2012-11-27 110 views
2

我正在寫一個excel電子表格,以便與稱爲Eve Online的遊戲一起使用。我的電子表格需要通過名爲eve-marketdata.com的數據提供商網站自動檢索數據。在eve-marketdata的開發者頁面上:http://eve-marketdata.com/developers/item_history2.php它提供了一些關於如何通過http發送「發佈」請求來請求數據的說明。試圖通過excel從網站檢索xml數據

例如:用於市場歷史請求的網址應該是:http://api.eve-marketdata.com/api/item_history2.xml?char_name=venoushka patel然後,可以說我想從區域10000002中檢索物品ID爲34的45天的數據。我將放在網址的結尾處:item_id = 34,days = 45和region_ids = 10000002,每個由&符號表示的完成產品符號:api.eve-marketdata.com/api/item_history2.xml?char_name=venoushka patel & type_ids = 34 & region_ids = 10000002 & days = 45(由於本網站發佈規定,刪除了http://)

因此,我需要某些單元格使用電子表格中的信息(例如item id,region id等)來解析適當將網址提交給網站,然後只抓取我正在查找的信息並將其放入單元格中。這在google文檔中比在excel中容易得多,因爲它們使用xpath的'importxml'特性。然而,谷歌文檔限制XML電話數量爲每個電子表格50和我的電子表格將有幾千,所以我必須使用Excel。

不,我不打算在excel中使用'從網絡導入'或'映射xml'到單元格功能,因爲我在電子表格中有數以千計的這些功能,而不是時間或資源效率。

有人告訴我,這可以使用下面的VBA代碼來完成:

Set objHTTP = CreateObject("MSXML2.ServerXMLHTTP") 
URL = "http://www.somedomain.com" 
objHTTP.Open "POST", URL, False 
objHTTP.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" 
objHTTP.send ("") 

的問題是,雖然我在編程很好的Excel電子表格,我從來沒有使用VBA。我知道如何打開視覺基本編輯器,但這是關於它的。首先:

我該如何將其粘貼到vba編輯器中,然後在我的工作簿中調用它?我相信我必須在開始和結束函數中放入類似function()的東西,對嗎?

如何在我的工作表中調用此函數來完成我需要的功能?

有人可以解釋上面的代碼是做什麼的,以及我需要如何修改它來執行我的任務?

在進步,我真的很感激這些接收的任何幫助,並有社區(千在那裏),需要一種方式來做到這一點,以及龐大的一部分!

+1

你確定你一定要使用POST請求您的VBA的牙齒?您似乎正在描述GET請求。見http://www.w3schools.com/tags/ref_httpmethods.asp – barrowc

回答

2

你不會那麼做。首先,請求是GET而不是POST,所以這改變了事情。您可以使用類似如下:

Function ImportData(sUrl As String) As Variant 
     Dim oDoc As Object 
     Dim oAttr As Object 
     Dim oRow As Object 
     Dim x As Long: x = 1 
     Dim y As Long: y = 1 
     Dim vData() As Variant 

     Set oDoc = CreateObject("MSXML2.DOMDocument") 
     With oDoc 
      .Load sUrl 
      Do: DoEvents: Loop Until .readystate = 4 
      ReDim vData(1 To .getElementsByTagName("row").Length, 1 To 8) 
      For Each oRow In .getElementsByTagName("row") 
       For Each oAttr In oRow.Attributes 
        vData(x, y) = oAttr.Text 
        y = y + 1 
       Next oAttr 
       y = 1 
       x = x + 1 
      Next oRow 
     End With 

     ImportData = vData 

    End Function 


    Public Sub Test() 
     Dim g 
     'g = ImportData("http://api.eve-marketdata.com/api/item_history2.xml?char_name=venoushka%20patel&type_ids=34&region_ids=10000002&days=45") 
     'or 
     g = ImportData(Sheets(1).range("a1").Value) 
     Sheets(1).Cells(2, 1).Resize(UBound(g), UBound(g, 2)).Value = g 
    End Sub 

你可以把它在一個正常的模塊,然後運行該宏Test你可以看到你把你的網址進行測試。我不得不雖然承認,你可能會彌補這一個陡峭的學習曲線,它不會是最容易的項目,以削減

+0

謝謝凱爾!這至少會讓我開始。我將代碼粘貼到可視化基本編輯器中,並運行宏'測試',將45天的數據放入列中。 我不知道是否有可能做到這一點,而不使用宏?只需在表格中標明數據總是放置在哪裏(如果該特定項目有任何數據),並點擊刷新數據或其他內容,並且所有數據都會一次全部更新。 另外,我將如何去限制出現的一些數據?舉例來說,如果我只想要日期/低價格/平均價格並跳過顯示所有其他內容。 – Venoushka

+0

是的,您可以在沒有宏的情況下執行此操作,您可以使用導入XML/Web查詢,但是您指定不想這樣做。您可以在標有刷新的工作表上放置一個按鈕,並根據需要運行宏。 – SWa

+0

我明白了。嘿,這裏有一個問題,你可以像這樣的公式接受來自工作表的輸入 - 例如,在vba中保留一個像這樣的通用公式,但是項目ID,區域ID或其他數據在電子表格本身中被引用?那會很好。另外,也許你可以指導我一個很好的網站和/或書籍學習VBA與Excel一起使用?你非常感謝我的幫助! – Venoushka