【问题标题】:Trying to retrieve xml data from a website through excel试图通过excel从网站检索xml数据
【发布时间】:2012-11-14 18:56:39
【问题描述】:

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

例如:用于市场历史请求的 url 将是:http://api.eve-marketdata.com/api/item_history2.xml?char_name=venoushkapatel 然后,假设我想从区域 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 等)来解析适当的 url,将 url 提交到站点,然后只获取我正在寻找的信息并将其放入一个单元格中。目前这在 google docs 而不是 excel 上要容易得多,因为它们的“importxml”功能利用了 xpath。但是,谷歌文档将每个电子表格的 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 编辑器中,然后在我的工作簿中调用它?我相信我必须将函数()之类的东西放在开头和结尾函数的末尾,对吗?

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

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

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

【问题讨论】:

标签: xml excel vba import createobject


【解决方案1】:

你不会那样做的。首先,请求是 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 咬牙切齿的最简单的项目

【讨论】:

  • 谢谢凯尔!这至少会让我开始。我将您的代码粘贴到 Visual Basic 编辑器中并运行宏“测试”,它将 45 天的数据放入列中。我想知道是否可以在不使用宏的情况下做到这一点?只需在工作表上标出始终放置数据的区域(当然,如果该特定项目有任何数据)并点击刷新数据或其他内容,所有这些都会立即更新。另外,我将如何限制某些数据的出现?例如,如果我只想要日期/低价/平均价格并跳过显示所有其他内容。
  • 是的,您可以在没有宏的情况下执行此操作,您将使用导入 XML/Web 查询,但您指定不想这样做。如果您愿意,可以在标有刷新的工作表上放置一个按钮并运行宏。
  • 我明白了。嘿,这是一个问题,像这样的公式可以接受来自工作表的输入吗?例如,在 vba 中保留这样的通用公式,但在电子表格本身中引用了项目 ID、区域 ID 或其他数据?那将是相当不错的。另外,也许您可​​以将我引导到一个好的网站和/或学习vba以与excel一起使用的书?你帮了我很大的忙,我真的很感激!
  • 是的,您可以参考 VBA 中的工作表 - 我在上面添加了该选项。我看过的最好的书之一是wrox.com/WileyCDA/WroxTitle/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-28
相关资源
最近更新 更多