Von XML Datei in Excel importieren

  • Excel

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von Kahlua.

    Von XML Datei in Excel importieren

    Hallo Leute,

    ich habe ein kleines Problem. Ich muss aus einer vorhandenen XML Datei bestimmte Daten in eine Excel Datei überführen, welche aber keine Tabellenform haben soll wie
    sonst bei der XML Importierung. Außerdem soll abgeprüft werden, ob bestimmte Wörter in dieser Datei vorkommen und falls ja soll dies mit einem Hacken oder Kreuz dargestellt werden.

    Nachdem ich erst gerade die Grundlagen von VBA lerne, wollte ich Fragen ob ihr einen Typ habt an diese Sache heran zu gehen?!
    Ich hoffe Ihr versteht was ich meine..


    Hier mal als Beispiel die feste Einteilung der Excel Datei


    Vielen Dank schonmal im Vorraus

    *Topic verschoben*

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Hallo @Kahlua!

    Erst einmal: Herzlich willkommen im Forum!
    Zu deinem Post: Da du als Thread-Tag "VB.NET" verwendest, in deinem Post aber von "VBA" redest, bin ich etwas verwirrt.

    Bezieht sich deine Frage auf das VB, welches du in Excel verwenden kannst, oder das, für was du Visual Studio verwendest?
    Für den ersten Fall: Was du probieren könntest, ist die Datei einzulesen und sie dann per Range()-Zugriff eintragen. Sollte es sich bei deiner Problemstellung um ein VB.NET Problem handeln: Im Prinzip (fast) das selbe: Über einen FileStream einlesen, jedoch die Übertragung in deine Excel-Mappe kannst du dann entweder über COM, einen Datenbanktreiber (mit SQL) oder mit speziellen (open Source) Libaries lösen.

    Falls du noch mehr Informationen brauchst, bitte melden :D

    Lg Radinator
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell
    Hallo Radinator!
    Danke für dein Antwort. Ja es handelt sich tatsächlich um VBA über Excel, sorry da hab ich wohl etwas zu voreilig VB.NET gedrückt.
    Gut dann werde ich mir diesen Range Zugriff mal ansehen. Weisst du wo ich passende Lektüre (womöglich im Netz) finde?

    Muss mich leider erstmal rein lesen in die Problematik
    Also zu Literatur muss ich leider passen...ich schau da zuerst mal bei Google vorbei: vba datei einlesen
    Und wenn du da nix findest, der zweite Eintrag ist eh aus dem Forum hier ;D (Geht darum, wie man zeilenweise eine Datei mit VBA einliest)
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell
    Hmm. Ich befürchte die Aufgabenstellung geht weit über mein Können der VBA Programmierung hinaus. Ich habe aus einem anderen Forum eine etwas ähnliche Aufgabenstellung gefunden
    und versuche diese so weit wie Möglich zu adaptierten. Leider scheitere ich schon beim ersten Teil mit der Angabe des Pfads. Bei mir wird die XML Datei nicht gefunden. Kann mir jemand helfen?

    habe mich jetzt mal an sowas orientert:

    Visual Basic-Quellcode

    1. Option Explicit
    2. Private Sub CommandButton1_Click()
    3. Const XMLDATEI As String = "D:\$PP\$XML\Bohrer.xml" ' <--- ANPASSEN ---
    4. XMLDateiAuslesen XMLDATEI
    5. End Sub
    6. Private Sub XMLDateiAuslesen(ByVal XmlDateiMitPfad As String)
    7. Dim xmlDoc As New MSXML2.DOMDocument
    8. Dim xmlKnoten As IXMLDOMNode
    9. Dim xpathKnoten As String
    10. Dim xpathAttrib As String
    11. xmlDoc.async = False
    12. xmlDoc.validateOnParse = True ' Auf Fehler prüfen
    13. xmlDoc.Load (XmlDateiMitPfad) ' XML-Datei laden
    14. If xmlDoc.Load(XmlDateiMitPfad) = False Then
    15. MsgBox "XML-Datei: '" & XmlDateiMitPfad & "' wurde nicht gefunden"
    16. Exit Sub
    17. ElseIf xmlDoc.parseError = True Then
    18. MsgBox "XML-Datei: '" & XmlDateiMitPfad & "' hat fehlerhaften Aufbau (ist nicht 'wohlgeformt')"
    19. Exit Sub
    20. End If
    21. xmlDoc.setProperty "SelectionLanguage", "XPath" ' Suchen soll mittels XPath erfolgen
    22. ' Auf <MB_BOHRER>-Knoten gehen und prüfen, ob der Wert des Attributs ExternalId übereinstimmt
    23. xpathKnoten = "/*/Objects/MB_BOHRER" ' Knoten-Teil für die XPath-Anweisung
    24. xpathAttrib = "[@ExternalId='" & ActiveSheet.Range("A3") & "']" ' Attribute-Teil für die XPath-Anweisung
    25. Set xmlKnoten = xmlDoc.selectSingleNode(xpathKnoten & xpathAttrib) ' XPath-Anweisung mit Attribut-Vergleich
    26. If xmlKnoten Is Nothing Then
    27. MsgBox "Knoten nicht gefunden. Vermutlich falsche XML-Struktur"
    28. Exit Sub
    29. End If
    30. With ActiveSheet
    31. .Range("B3") = xmlKnoten.selectSingleNode("DS").Text
    32. .Range("C3") = xmlKnoten.selectSingleNode("L3").Text
    33. .Range("D3") = xmlKnoten.selectSingleNode("CutterLength").Text
    34. .Range("E3") = xmlKnoten.selectSingleNode("MaxWorkDepth").Text
    35. End With
    36. End Sub

    dazu gab es folgende XML:

    XML-Quellcode

    1. <?xml version="1.0" encoding="Windows-1252" standalone="yes" ?>
    2. - <Data PpXmlVer="7.0">
    3. - <Objects>
    4. - <PmToolInstance ExternalId="14-Feb-2012__07_28_34_3332_5">
    5. <name>Bohrer, 5.0x85-K40</name>
    6. <comment />
    7. <attachments />
    8. <status>Open</status>
    9. <copies />
    10. <layout>14-Feb-2012__07_28_34_3332_5Layout</layout>
    11. <availability>0</availability>
    12. <percentUsed>0</percentUsed>
    13. <variant>NULL</variant>
    14. <relativeTo>NULL</relativeTo>
    15. <partDirections />
    16. <cycleTime>0</cycleTime>
    17. <usesTool />
    18. <amount>1</amount>
    19. <throughput>0</throughput>
    20. <prototype>08-Jun-2011__12_30_35_2064_1</prototype>
    21. <active>0</active>
    22. - <NodeInfo>
    23. <Id>3177156</Id>
    24. <Name>Bohrer, 5.0x85-K40</Name>
    25. <family>Resource</family>
    26. - <version>
    27. - <versionId>
    28. <idEntry>1</idEntry>
    29. <idEntry>223</idEntry>
    30. <idEntry>0</idEntry>
    31. <idEntry>0</idEntry>
    32. </versionId>
    33. <versionName>Modul</versionName>
    34. </version>
    35. - <status>
    36. <createdBy>amg</createdBy>
    37. <lastModifiedBy>mustermann</lastModifiedBy>
    38. <modificationDate>1/3/2012 7:59:59</modificationDate>
    39. </status>
    40. <cioState>0</cioState>
    41. </NodeInfo>
    42. </PmToolInstance>
    43. - <PmLayout ExternalId="14-Feb-2012__07_28_34_3332_5Layout">
    44. <name>Layout*</name>
    45. <comment />
    46. <attachments />
    47. <status>Open</status>
    48. <children />
    49. - <location>
    50. <item>0</item>
    51. <item>0</item>
    52. <item>-165.451</item>
    53. </location>
    54. - <rotation>
    55. <item>0</item>
    56. <item>0</item>
    57. <item>0</item>
    58. </rotation>
    59. <boundedBoxMin>0_0_0</boundedBoxMin>
    60. <boundedBoxMax>0_0_0</boundedBoxMax>
    61. <mountedTo>NULL</mountedTo>
    62. <mountedTools />
    63. - <NodeInfo>
    64. <Id>3177159</Id>
    65. <Name>Layout*</Name>
    66. <family>PmLayout</family>
    67. - <version>
    68. - <versionId>
    69. <idEntry>1</idEntry>
    70. <idEntry>223</idEntry>
    71. <idEntry>0</idEntry>
    72. <idEntry>0</idEntry>
    73. </versionId>
    74. <versionName>Modul</versionName>
    75. </version>
    76. - <status>
    77. <createdBy>amg</createdBy>
    78. <lastModifiedBy>amg</lastModifiedBy>
    79. <modificationDate>14/2/2012 15:57:32</modificationDate>
    80. </status>
    81. - <absoluteLocation>
    82. <x>0</x>
    83. <y>0</y>
    84. <z>-165.451</z>
    85. <rx>0</rx>
    86. <ry>0</ry>
    87. <rz>0</rz>
    88. </absoluteLocation>
    89. <cioState>0</cioState>
    90. </NodeInfo>
    91. </PmLayout>
    92. - <MB_BOHRER ExternalId="08-Jun-2011__12_30_35_2064_1">
    93. <name>Bohrer, 5.0x85-K40</name>
    94. <comment />
    95. <attachments />
    96. <status>Open</status>
    97. <type />
    98. <supplier>HAM</supplier>
    99. <costGroup />
    100. <operatingCostPerHour>0</operatingCostPerHour>
    101. <length>0</length>
    102. <width>0</width>
    103. <height>0</height>
    104. <material />
    105. <weight>0</weight>
    106. <image>NULL</image>
    107. <cadFile>NULL</cadFile>
    108. <threeDRep>NULL</threeDRep>
    109. <twoDRep>NULL</twoDRep>
    110. <children />
    111. <investmentCost>0</investmentCost>
    112. <variant>NULL</variant>
    113. <active>0</active>
    114. <web3DFile>NULL</web3DFile>
    115. <jtThreeDRep>NULL</jtThreeDRep>
    116. <CutterDiameter>5</CutterDiameter>
    117. <CutterLength>85</CutterLength>
    118. <DS>6</DS>
    119. <L3>30</L3>
    120. <MaxWorkDepth>28</MaxWorkDepth>
    121. <WS>120</WS>
    122. <version />
    123. <catalogNumber />
    124. <cadSystem>0</cadSystem>
    125. <boundedBoxMin>0_0_0</boundedBoxMin>
    126. <boundedBoxMax>0_0_0</boundedBoxMax>
    127. <NumberOfCuttingEdges>2</NumberOfCuttingEdges>
    128. <Bestellnummer>123</Bestellnummer>
    129. <CutterEdgeMaterialName>VHM</CutterEdgeMaterialName>
    130. <Sachnummer>F12345</Sachnummer>
    131. <ShankClass>ZYL</ShankClass>
    132. <TechnologyName>BOHREN_10-14</TechnologyName>
    133. - <NodeInfo>
    134. <Id>2473739</Id>
    135. <Name>Bohrer, 5.0x85-K40</Name>
    136. <family>ToolPrototype</family>
    137. - <version>
    138. - <versionId>
    139. <idEntry>1</idEntry>
    140. <idEntry>223</idEntry>
    141. <idEntry>0</idEntry>
    142. <idEntry>0</idEntry>
    143. </versionId>
    144. <versionName>Modul</versionName>
    145. </version>
    146. - <status>
    147. <createdBy>hans</createdBy>
    148. <lastModifiedBy>mustermann</lastModifiedBy>
    149. <modificationDate>1/3/2012 7:59:58</modificationDate>
    150. </status>
    151. <cioState>0</cioState>
    152. </NodeInfo>
    153. </MB_BOHRER>
    154. </Objects>
    155. </Data>
    156. Das VBA-Programm soll per Button_Click die ExternalId vom MB_Bohrer aus Zelle 'A3' in 'Tabelle1' nehmen (hier: "08-Jun-2011__12_30_35_2064_1") und dann in dem XML-Dokument danach suchen. Anschließend sollen bestimmte Kinderknoten dieses Bohrers (DS, L3, CutterLength, MaxWorkDepth) angewählt werden und die Werte in die Zellen 'B3', 'C3', 'D3', 'E3' ausgegeben werden
    Welche Referenz für XML verwendest du?
    Ich habe es gerade getestet und ich hatte auch den Fehler the system cannot locate the object specified.

    Dann habe ich einmal aus einem XML VBScript dies ausgeführt:

    Visual Basic-Quellcode

    1. dim xmlDoc
    2. Set xmlDoc = CreateObject("Microsoft.XMLDOM")
    3. xmlDoc.Async = "False"
    4. dim r
    5. r = xmlDoc.Load("test.xml")


    Das hat funktioniert und danach lief es auch in Excel mit


    Visual Basic-Quellcode

    1. Private Sub XMLDateiAuslesen(ByVal XmlDateiMitPfad As String)
    2. Dim xmlDoc As New MSXML2.DOMDocument
    3. Dim xmlKnoten As IXMLDOMNode
    4. Dim xpathKnoten As String
    5. Dim xpathAttrib As String
    6. xmlDoc.async = False
    7. xmlDoc.validateOnParse = True ' Auf Fehler prüfen
    8. xmlDoc.Load (XmlDateiMitPfad) ' XML-Datei laden
    9. If xmlDoc.Load(XmlDateiMitPfad) = False Then
    10. MsgBox "Cannot load xml"
    11. Exit Sub
    12. End If


    Ich vermute es war iwas mit dem ActiveX im argen. Sehr ungewöhnlich.. vll hast du ein ähnliches Problem..

    LG
    Das ist meine Signatur und sie wird wunderbar sein!
    Merkwürdig. Mit MSXML hatte ich noch nie Probleme.
    Aber ich erinnere mich, bei anderen Libraries auch schon auf Late-Binding umgestellt zu haben, weil es mit den Referenzen Probleme gab.
    Allerdings waren diese Probleme dann meist auf anderen Rechnern als dem Entwicklungsrechner.

    Aber die Stolperfallen sind ja bekanntlich vielseitig...
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Jo, das Problem hatte ich auch noch nie zuvor. Tendiere aber auch schon länger wieder zu Latebinding bei den meisten Objekten. Ist zwar von der Lesbarkeit und IntelliSense und Performance schlechter, aber dafür läuft es im Normalfall überall..
    Das ist meine Signatur und sie wird wunderbar sein!
    Also bei mir funktioniert es leider immer noch nicht. Habe jetzt Microsoft XML 6.0 auch nochmal mit angeklickt.
    Muss ich beim Button erstellen den irgendwas beachten? Ich habe jetzt dieses Beispiel einfach mal adaptiert, natürlich nicht mit den selben Dateien, aber irgendwie funktioniert das alles nicht.

    Ich verstehe zwar soweit das vorgehen, aber ich bekomme immer eine Fehlermeldung mit der Message Box:

    If xmlDoc.Load(XmlDateiMitPfad) = False Then
    MsgBox "XML-Datei: '" & XmlDateiMitPfad & "' wurde nicht gefunden", also meine Datei wurde nicht gefunden, obwohl Sie wie oben angegeben im existiert...

    vielleicht kann mir es jemand erklären?!

    Kahlua schrieb:

    meine Datei wurde nicht gefunden
    Die Fehlermeldung ist ja sehr irreführend programmiert.
    Da ging halt beim Load irgendetwas schief.
    Das kann alle möglichen Ursachen haben.
    Wie du dem tatsächlichen Fehler auf die Spur kommst:
    msdn.microsoft.com/en-us/libra…547.aspx#beginner_failure
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Kahlua schrieb:

    Wenn ich den Button betätige, kommt die Meldung wie es auch programmiert wurde
    Ist mir schon klar.
    Works as designed. ;)
    Wenn irgend etwas beim Laden schief läuft, kommt die Fehlermeldung "Datei wurde nicht gefunden".
    Dabei kann es tausend andere Ursachen geben.
    Das könnte falsches XML-Format sein oder ein Sonderzeichen, das nicht XML-konform ist, oder, oder, oder ...
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --