web-dev-qa-db-de.com

Laden Sie XML über VBA in Excel

Ich habe ein bisschen VBA, das eine XML-Datei über VBA lädt. Wenn es jedoch importiert wird, ist alles in einer Spalte und nicht in eine Tabelle aufgeteilt. 

Wenn ich dies manuell über die Registerkarte "Daten" importiere, wird die Warnung angezeigt, dass kein Schema vorhanden ist. Sie werden jedoch gefragt, ob ich möchte, dass Excel ein auf Quelldaten basierendes Element erstellt. Dadurch werden alle Daten in einer Nice-Tabelle abgelegt.

Ich möchte, dass dies automatisch in meinem aktuellen VBA-Code geschieht:

VBA sieht aus wie

      Sub refresh()

'--------------------------------1. Profile IDs-----------------------------------'


'date variables

Dim start_period As String
start_period = Sheets("Automated").Cells(1, 6).Value
Dim end_period As String
end_period = Sheets("Automated").Cells(1, 7).Value

'report id variable names
Dim BusinessplanningReportID As String

'--------------------------------REST queries--------------------------------'
Dim Businessplanning As String



'REST query values
Businessplanning = "URL;http://api.trucast.net/2/saved_searches/00000/pivot/content_volume_trend/?apikey=0000000&start=" + start_period + "&end=" + end_period + "&format=xml"




'--------------------------------------------Data connections-----------------------------------'
'key metrics
With Worksheets("Sheet1").QueryTables.Add(Connection:=Businessplanning, Destination:=Worksheets("Sheet1").Range("A1"))

  .RefreshStyle = xlOverwriteCells
  .SaveData = True

End With

Momentan präsentieren sich die Daten dann unstrukturiert. Wie kann ich dies automatisch in eine Tabelle umwandeln?

<result>
<entry>
<published_date>20130201</published_date>
<post_count>18</post_count>
</entry>

Vielen Dank,

::Endgültige Lösung::

 Sub XMLfromPPTExample2()
Dim XDoc As MSXML2.DOMDocument
Dim xresult As MSXML2.IXMLDOMNode
Dim xentry As MSXML2.IXMLDOMNode
Dim xChild As MSXML2.IXMLDOMNode
Dim start_period As String
    start_period = Sheets("Automated").Cells(1, 6).Value
    Dim end_period As String
    end_period = Sheets("Automated").Cells(1, 7).Value
Dim wb As Workbook
Dim Col As Integer
Dim Row As Integer


Set XDoc = New MSXML2.DOMDocument
XDoc.async = False
XDoc.validateOnParse = False
XDoc.Load ("http://api.trucast.net/2/saved_searches/0000/pivot/content_volume_trend/?apikey=00000&start=" + start_period + "&end=" + end_period + "&format=xml")
LoadOption = xlXmlLoadImportToList

Set xresult = XDoc.DocumentElement
Set xentry = xresult.FirstChild


Col = 1
Row = 1

For Each xentry In xresult.ChildNodes
 Row = 1


    For Each xChild In xentry.ChildNodes
      Worksheets("Sheet2").Cells(Col, Row).Value = xChild.Text
             'MsgBox xChild.BaseName & " " & xChild.Text
      Row = Row + 1
      'Col = Col + 1

          Next xChild
'Row = Row + 1
Col = Col + 1
Next xentry

End Sub
9
Fox87

DER "HARTKODIERTE WEG" IS DIESES:

Ausgehend von diesem 

<result>
   <entry>
      <published_date>20130201</published_date>
      <post_count>18</post_count>    
   </entry>
  <entry>
      <published_date>20120201</published_date>
      <post_count>15</post_count>    
   </entry>

und Sie möchten ein Excel mit zwei Spalten erhalten:

**published_date** |  **post_count**
20130201       |           18
20120201       |           15

damit wir davon ausgehen können, dass Sie in Ihrem XML immer haben 

<result><entry><Element>VALUE</Element><Element...n>VALUE</Element...n></entry>

WICHTIG: Öffnen Sie den VBA-Editor in PowerPoint, Excel .. Word und fügen Sie Verweise auf "Microsoft XML, v3.0" hinzu (dieser Verweis bezieht sich auf Office 2000 ... Sie haben möglicherweise andere). 

Quelle: http://vba2vsto.blogspot.it/2008/12/reading-xml-from-vba.html

Employee.XML

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<EmpDetails>
<Employee>
<Name>ABC</Name>
<Dept>IT-Software</Dept>
<Location>New Delhi</Location>
</Employee>
<Employee>
<Name>XYZ</Name>
<Dept>IT-Software</Dept>
<Location>Chennai</Location>
</Employee>
<Employee>
<Name>IJK</Name>
<Dept>HR Operations</Dept>
<Location>Bangalore</Location>
</Employee>
</EmpDetails>

CODE ZU LESEN ÜBER XML

Sub XMLfromPPTExample()
Dim XDoc As MSXML2.DOMDocument
Dim xEmpDetails As MSXML2.IXMLDOMNode
Dim xEmployee As MSXML2.IXMLDOMNode
Dim xChild As MSXML2.IXMLDOMNode

Set XDoc = New MSXML2.DOMDocument
XDoc.async = False
XDoc.validateOnParse = False
XDoc.Load ("C:\Emp.xml")
Set xEmpDetails = XDoc.documentElement
Set xEmployee = xEmpDetails.firstChild
For Each xEmployee In xEmpDetails.childNodes
For Each xChild In xEmployee.childNodes
MsgBox xChild.baseName & " " & xChild.Text
Next xChild
Next xEmployee
End Sub

In Ihrem Fall müssen Sie natürlich Ihre Routine anpassen:

result -> EmpDetails im bereitgestellten Code
Eintrag -> Mitarbeiter im angegebenen Code 

sowie weitere notwendige Einstellungen.


Auf diese Weise können Sie beliebig viele Elemente "entry" und "entry child" haben.

Wenn Sie alle Elemente in Ihrem "Eintrag" durchlaufen, erhalten Sie Ihre SPALTE. Jeder neue Eintrag ist dann eine neue Reihe.

Leider habe ich kein Excel auf dem MAC, also lege ich nur die Logik auf. Sie sollten den sintax selbst überprüfen ... Auf diese Weise erstellen Sie eine Excel-Tabelle auf dem gewünschten Arbeitsblatt.

Dim col = 1; Dim row=1;

For Each xEmployee In xEmpDetails.childNodes
    col = 1
    For Each xChild In xEmployee.childNodes
       Worksheets("NAMEOFTHESHEET").Cells(col, row).Value = xChild.Text
       MsgBox xChild.baseName & " " & xChild.Text
       col = col + 1;
    Next xChild
row = row+1;
Next xEmployee

DER KORRETE WEG SOLLTE DIESES SEIN:

LoadOption: = xlXmlLoadImportToList?

Sie erhalten das XML von einem URL-Aufruf. Ich empfehle jedoch dringend, zu Beginn mit einer XML-Datei auf der Festplatte zu arbeiten und zu überprüfen, ob sie richtig ist. Sie sollten also ein Beispiel-XML von diesem "WebService" abrufen und auf der Festplatte speichern. Versuchen Sie es auf folgende Weise zu laden:

   Sub ImportXMLtoList()
    Dim strTargetFile As String
    Dim wb as Workbook

         Application.Screenupdating = False
         Application.DisplayAlerts = False
         strTargetFile = "C:\example.xml"
         Set wb = Workbooks.OpenXML(Filename:=strTargetFile,        LoadOption:=xlXmlLoadImportToList)
         Application.DisplayAlerts = True

         wb.Sheets(1).UsedRange.Copy ThisWorkbook.Sheets("Sheet2").Range("A1")
         wb.Close False
         Application.Screenupdating = True
    End Sub
9
Madthew

Ich habe ein paar Abschnitte aus anderen Codeabschnitten verwendet, die ich gefunden habe. Mit dem folgenden Code wird der Benutzer aufgefordert, die gewünschte XML-Datei auszuwählen, und er kann die ausgewählte Datei einfach hinzufügen oder in ihre vorhandene Zuordnung importieren, ohne eine neue Datei zu öffnen.

Sub Import_XML()
'
' Import_XML Macro
'
    'Select the file
    Fname = Application.GetOpenFilename(FileFilter:="xml files (*.xml), *.xml", MultiSelect:=False)

    'Check if file selected
    If Fname = False Then
        Exit Sub
        Else

    End If

    'Import selected XML file into existing, custom mapping

    Range("B5").Select
    ActiveWorkbook.XmlMaps("Result_file_Map").Import URL:=Fname
End Sub
0
Joe