尝试通过excel从网站检索xml数据

时间:2012-11-27 07:34:42

标签: xml excel vba import createobject

我正在编写一个excel电子表格,用于名为Eve Online的游戏。我的电子表格需要通过名为eve-marketdata.com的数据提供商网站自动检索数据。在eve-marketdata的开发者页面上:http://eve-marketdata.com/developers/item_history2.php它通过http发送“发布”请求,提供了有关如何请求数据的一些说明。

例如:用于市场历史记录请求的网址是:http://api.eve-marketdata.com/api/item_history2.xml?char_name=venoushka patel然后,假设我想从区域10000002检索项目ID 34的45天数据。我会放在最后url: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://由于对此发布规定位点)

因此,我需要某些单元格使用电子表格中的信息(例如商品ID,区域ID等)来解析相应的网址,将网址提交到网站,然后只获取我要查找的信息并将其放入一个单元格。由于他们的'importxml'功能利用xpath,目前谷歌文档而不是excel更容易。但是,谷歌文档将xml调用的数量限制为每个电子表格50个,而我的电子表格将有几千个,所以我必须使用excel。

不,我不会使用'从web导入'或'map xml'到excel中的单元格功能,因为我在电子表格中有数千个这样做,而不是时间或资源效率。

我被告知可以使用以下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。我知道如何打开visual basic编辑器,但这就是它。首先:

如何将其粘贴到vba编辑器中,然后在我的工作簿中调用它?我相信我必须在开头和结尾处输入类似function()的内容,对吧?

如何在工作表中调用此函数来执行我需要它执行的操作?

有人可以解释上面代码的作用,以及我如何修改它以执行我的任务?

事先,我真的很感激任何收到的帮助,社区的很大一部分(数千人)需要一种方法来做到这一点!

1 个答案:

答案 0 :(得分: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来测试它,您可以看到您放置网址的位置。我不得不承认,你可能会因为这个问题而陷入陡峭的学习困境,但这并不是削减你的VBA牙齿的最简单的项目

相关问题