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

试图通过excel从网站检索xml数据,xml,excel,vba,import,createobject,Xml,Excel,Vba,Import,Createobject,我正在编写一个excel电子表格,用于一个名为Eve Online的游戏。我的电子表格需要通过名为eve-marketdata.com的数据提供商网站自动检索数据。在eve marketdata的开发者页面上:它给出了一些关于如何通过http发送“post”请求来请求数据的说明 例如:用于市场历史记录请求的url将是:patel,那么,假设我想从区域10000002检索商品id 34的45天数据。我会在url的末尾放上:item_id=34、days=45和region_id=10000002,

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

例如:用于市场历史记录请求的url将是:patel,那么,假设我想从区域10000002检索商品id 34的45天数据。我会在url的末尾放上:item_id=34、days=45和region_id=10000002,每个都用&符号分隔,表示一个成品:api.eve marketdata.com/api/item_history2.xml?char_name=venoushka patel&type_id=34和region_id=10000002&days=45(由于本网站的发布规定,删除了http://链接)

因此,我需要某些单元格来使用电子表格中的信息,例如项目ID、区域ID等,来解析适当的url,将url提交到站点,然后仅获取我正在查找的信息并将其放置到单元格中。这在google文档上比在excel上容易得多,因为它们的“importxml”特性利用了xpath。然而,google文档将每个电子表格的xml调用次数限制为50次,而我的电子表格将有几千次,因此我必须使用excel

不,我不会在excel中使用“从web导入”或“将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。我知道如何打开visual basic编辑器,但仅此而已。首先:

如何将其粘贴到vba编辑器中,然后在工作簿中调用它?我相信我必须在开头放上类似于function()的东西,在结尾放上end function,对吗

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

有人能解释一下上面的代码是做什么的,以及我需要如何修改它来执行我的任务吗


在此之前,我真的非常感谢在这方面得到的任何帮助,社区中有很大一部分人(数千人)也需要一种方法来做到这一点

你不会那样做的。首先,请求是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
来测试它,您可以看到将url放在哪里。不过我必须承认,你可能会遇到一个陡峭的学习曲线,这不是一个最简单的项目,你肯定需要使用POST请求吗?您似乎正在描述GET请求。谢谢你,凯尔!这至少会让我开始。我将代码粘贴到VisualBasic编辑器中并运行宏“test”,它将45天的数据放入列中。我想知道不使用宏是否可以执行此操作?只需在工作表上标出一个区域,该区域将始终放置数据(当然,如果该特定项目有任何数据),然后点击“刷新数据”或其他内容,所有数据将立即更新。另外,我将如何限制某些数据的出现?比如说,如果我只想要日期/低价/平均价格,而跳过显示所有其他内容。是的,您可以不使用宏来执行此操作,您可以使用导入XML/web查询,但您指定了不希望这样做。您可以在工作表上放置一个标签为“刷新”的按钮,如果您愿意,可以运行宏。我明白了。嘿,这里有一个问题要问你-像这样的公式可以接受来自工作表的输入吗-例如,在vba中保留这样的通用公式,但在电子表格中引用了项目id、区域id或其他数据?那太好了。另外,也许你可以告诉我一个好的网站和/或学习vba与excel一起使用的书籍?你帮了我这么多忙,我真的很感激!是的,您可以从VBA引用工作表-我在上面添加了该选项。我看过的最好的书之一是