2

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

例如:用于市场历史请求的 url 将是:http: //api.eve-marketdata.com/api/item_history2.xml?char_name= venoushka patel 然后,假设我想检索项目的 45 天数据id 34,来自区域 10000002。我将在 url 的末尾放置:item_id=34、days=45 和 region_ids=10000002,每个都由 & 符号分隔,用于:api.eve-marketdata.com/api/ item_history2.xml?char_name=venoushka patel&type_ids=34®ion_ids=10000002&days=45(由于本站发布规定删除了http://)

所以,我需要某些单元格来使用电子表格中的信息,例如项目 ID、区域 ID 等,以一起解析适当的 url,将 url 提交到站点,然后只获取我正在寻找的信息并放置它进入一个单元格。目前这在 google docs 而不是 excel 上要容易得多,因为它们的“importxml”功能利用了 xpath。但是,谷歌文档将每个电子表格的 xml 调用次数限制为 50,而我的电子表格将有几千个,所以我必须使用 excel。

不,我不会使用“从 Web 导入”或“将 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 () 之类的东西,在结尾加上 end 函数,对吧?

我如何在我的工作表中调用这个函数来做我需要它做的事情?

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

在此之前,我真的很感谢在这方面收到的任何帮助,并且社区中有很大一部分(成千上万的人)也需要一种方法来做到这一点!

4

1 回答 1

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您可以看到您将 url 放在哪里。不过我不得不承认,你可能会在这个过程中经历一段陡峭的学习曲线,它不会是最容易让你的 VBA 咬牙切齿的项目

于 2012-11-27T07:56:46.203 回答