VBA XML导入 - 标题问题

时间:2014-02-26 01:56:57

标签: xml excel vba excel-vba

我目前有一些(目前有4个)单独的函数可以将数据从XML网页导入Excel工作表。它工作得很好,除了表总是添加标题。

Sub XMLImportMINS()
 On Error GoTo Errorcatch
 ActiveWorkbook.XmlImport URL:= _
 "http://api.eve-central.com/api/marketstat?typeid=34&typeid=35&typeid=36&typeid=37&typeid=38&typeid=39&typeid=40&typeid=25595&typeid=25605&typeid=25600&typeid=25599&typeid=25590&typeid=25601&typeid=25603&typeid=25588&typeid=25594&typeid=25602&typeid=25598&typeid=25606&typeid=2367&typeid=2348&typeid=11399&typeid=33539&typeid=2346&typeid=12836&usesystem=30000142", _
  ImportMap:=Nothing, _
  Overwrite:=True, Destination:=Range("ISKValues!$H$4")
Exit Sub

Errorcatch:
MsgBox Err.Description
End Sub

相当简单的脚本只是为了从eve-central.com检索存储在网页上的数据。它将输入一个包含与typeID一样多的行的表(在本例中为25),但它会在顶部添加一个标题。

然后标题意味着导入我需要的四个表格的数据,每个表格将它们分开1个,最后会看到相当杂乱的标题。我可以手动编辑它们并刷新表格,但重新启动excel后连接会搞乱(这就是我从手动导入到基于VBA的导入的原因)。

我不确定如何使用Excel VBA编辑表格属性,但我认为我可以在初始导入中将它们分开1,编辑表格中的标题并将表格全部移动以使其正确放置?< / p>

1 个答案:

答案 0 :(得分:1)

很抱歉发布这样一个不完整的答案,但结果却是大量工作。

基本上,我认为你可以做的是从API中加载多个查询(每次查询提到25个ID的限制)到MSXML2对象中。然后,您可以在代码中组合您要查找的结果,然后导出到工作表。我有一切工作,除了导出到工作表(证明是用尽代码)。

以下是我的工作(注意请务必设置对Microsoft XML v6.0的引用):

Public Sub getXML()
    Dim i As Long
    Dim iLast As Long

    Dim xmlFirst As MSXML2.DOMDocument60
    Set xmlFirst = New MSXML2.DOMDocument60

    Dim xmlSecond As MSXML2.DOMDocument60
    Set xmlSecond = New MSXML2.DOMDocument60

    ' grab the first set of data
    xmlFirst.validateOnParse = True
    xmlFirst.Load "http://api.eve-central.com/api/marketstat?typeid=25595&typeid=25605&typeid=25600&typeid=25599&typeid=25590&typeid=25601&typeid=25603&typeid=25588&typeid=25594&typeid=25602&typeid=25598&typeid=25606&typeid=2367&typeid=2348&typeid=11399&typeid=33539&typeid=2346&typeid=12836&usesystem=30000142"

    ' grab the second set of data
    xmlSecond.validateOnParse = True
    xmlSecond.Load "http://api.eve-central.com/api/marketstat?typeid=34&typeid=35&typeid=36&typeid=37&typeid=38&typeid=39&typeid=40"

    ' wait for the XML to load into the objects
    While (xmlFirst.readyState <> 4 Or xmlSecond.readyState <> 4)
        DoEvents
    Wend

    ' combine the second query into the first
    iLast = xmlSecond.ChildNodes(1).ChildNodes(0).ChildNodes.Length - 1
    For i = 0 To iLast
        xmlFirst.ChildNodes(1).ChildNodes(0).appendChild xmlSecond.ChildNodes(1).ChildNodes(0).ChildNodes(0)
    Next

End Sub

更难的部分实际上是将这些数据发送到工作表。我无法想出一个简单的方法来做到这一点。我试过跟this answer,但我觉得它比这更复杂。

顺便说一句,这部分代码:

xmlFirst.ChildNodes(1).ChildNodes(0).appendChild xmlSecond.ChildNodes(1).ChildNodes(0).ChildNodes(0)

我能够通过查看Locals窗口并深入挖掘节点来解决这个问题。

我希望这可以帮助您至少将数据合并到一个来源中。