2012-11-27 84 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