Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Daten aus XML-Datei direkt einlesen

Daten aus XML-Datei direkt einlesen
VG
Hallo ins Forum,
ich möchte aus XML-Dateien die Werte einzeln einlesen und einer Array-Variablen zuordnen.
Die einzelnen Werte der Bereiche HEADER (user, dateTime, name, etc.) und SUMMARY (boardsizex, boardsizey, etc.) sollen eingelesen werden.
Die XML-Datei sieht folgendermaßen aus:
<?xml version="1.0" encoding="UTF-8"?>
<!--Copyright 2010.-->
<QED version="2.10">
<Header>
<GeneratedBy user="Anonymous" libraryVersion="v10.1.0-120720" softwareVersion="v7.1.4-120720" softwarePackage="Ucamco - Integr8tor" />
<GeneratedOn dateTime="2012-08-13T14:50:24.622+02:00" />
<GeneratedFrom name="PCB_CABCC-PRTP-MKS.i8" path="c:\PCB_CABCC-PRTP-MKS.i8_9\work\PCB_CABCC-PRTP-MKS.i8.job" />
<Job ref="PCB_CABCC-PRTP-MKS.i8" id="9" />
<Customer ref="" />
</Header>
<Summary>
<SummaryParameter name="boardsizex">42.100</SummaryParameter>
<SummaryParameter name="boardsizey">50.200</SummaryParameter>
<SummaryParameter name="copperlayercount">6</SummaryParameter>
<SummaryParameter name="pcbthickness">1.000</SummaryParameter>
<SummaryParameter name="soldermask">4</SummaryParameter>
<SummaryParameter name="customerpanelsize">180.0 x 138.3</SummaryParameter>
<SummaryParameter name="legend">4</SummaryParameter>
<SummaryParameter name="smdpadstop">441</SummaryParameter>
<SummaryParameter name="paste">3</SummaryParameter>
<SummaryParameter name="smdpadsbottom">264</SummaryParameter>
<SummaryParameter name="peeloffmask">0</SummaryParameter>
<SummaryParameter name="smddensitytop">2442</SummaryParameter>
<SummaryParameter name="carbonmask">0</SummaryParameter>
<SummaryParameter name="smddensitybottom">1462</SummaryParameter>
<SummaryParameter name="electricaltest">Double Sided</SummaryParameter>
<SummaryParameter name="numberofnets">189</SummaryParameter>
<SummaryParameter name="drillholedensity">4109</SummaryParameter>
<SummaryParameter name="minimumaspectratio">5.0</SummaryParameter>
<SummaryParameter name="maskcolor">Green</SummaryParameter>
<SummaryParameter name="legendcolor">White</SummaryParameter>
<SummaryParameter name="holesinpad">No</SummaryParameter>
</Summary>
...
</QED>
Leider fehlt mir hier jegliche Kenntnis. Wie gehe ich am Einfachsten vor?
Vielen Dank vorab.
Beste Grüße,
VG

Anzeige
AW: Daten aus XML-Datei direkt einlesen
17.09.2012 21:16:31
Josef

Hallo VG,
als Ansatz.

Sub readXML()
  Dim vntFiles As Variant, vntValues() As Variant, vntOut As Variant
  Dim lngIndex As Long, lngC As Long
  Dim ff As Integer
  Dim strTmp As String
  
  vntFiles = Application.GetOpenFilename("XML Dateien (*.xml),*.xml", MultiSelect:=True)
  
  If IsArray(vntFiles) Then
    For lngIndex = LBound(vntFiles) To UBound(vntFiles)
      ff = FreeFile
      Open vntFiles(lngIndex) For Input As #ff
      Do While Not EOF(ff)
        Line Input #ff, strTmp
        If LCase(strTmp) Like "<summaryparameter name=*" Then
          strTmp = Mid(strTmp, 25)
          strTmp = Left(strTmp, Len(strTmp) - 19)
          Redim Preserve vntValues(lngC)
          vntValues(lngC) = Split(strTmp, """>")
          lngC = lngC + 1
        End If
      Loop
      Close #ff
    Next
  End If
  
  vntOut = Application.Transpose(Application.Transpose(vntValues))
  
  Range("A1").Resize(UBound(vntOut, 1), 2) = vntOut
End Sub



« Gruß Sepp »

Anzeige
AW: Daten aus XML-Datei direkt einlesen
17.09.2012 23:08:43
VG
Hallo Sepp,
danke für die Antwort.
Leider erhalte ich in der Zeile
vntOut = Application.Transpose(Application.Transpose(vntValues))
den Laufzeitfehler `5`(Ungültiger Prozeduraufruf oder ungültiges Argument)
Evl. kannst Du mit Kommentaren Deinen Weg erklären!?
Besten Dank,
VG

Anzeige
AW: Daten aus XML-Datei direkt einlesen
17.09.2012 23:32:13
Josef

Hallo VG,
der Fehler kommt, wenn keine Daten eingelesen wurden, also entspricht deine xml-Datei nicht dem von dir geposteten Beispiel!
Lade eine xml-Datei (evtl. gezipt) hoch.
Beim Code gibts nicht viel zu erklären, sozusagen "selbsterklärend".

« Gruß Sepp »

Anzeige
AW: Daten aus XML-Datei direkt einlesen
18.09.2012 08:18:15
VG
Hallo Sepp,
unter https://www.herber.de/bbs/user/81870.zip sind 2 XML-Files zu finden.
Zum Thema "selbsterklärend": habe mich heute nacht ein paar Stunden damit beschäftigt. Danke ;-)
Danke vorab für Deine Unterstützung.
Gruß,
VG

Anzeige
AW: Daten aus XML-Datei direkt einlesen
18.09.2012 21:07:04
Josef

Hallo VG,
probier mal (diesmal mit Kommentaren;-))
Sub readXML()
  Dim vntFiles As Variant, vntValues() As Variant
  Dim lngIndex As Long, lngC As Long
  Dim ff As Integer
  Dim strTmp As String
  
  'Datei(en) wählen - Mehrfachselektion möglich
  vntFiles = Application.GetOpenFilename("XML Dateien (*.xml),*.xml", MultiSelect:=True)
  
  'wennDateien gewählt
  If IsArray(vntFiles) Then
    'Ausgabearray dimensionieren
    Redim vntValues(1 To UBound(vntFiles) + 1, 1 To 22)
    vntValues(1, 1) = "File"
    'Dateien durchlaufen
    For lngIndex = LBound(vntFiles) To UBound(vntFiles)
      'Dateiname
      vntValues(lngIndex + 1, 1) = Mid(vntFiles(lngIndex), InStrRev(vntFiles(lngIndex), "\") + 1)
      ff = FreeFile
      lngC = 1
      'xml-Datei öffnen
      Open vntFiles(lngIndex) For Input As #ff
      'Zeilen durchlaufen
      Do While Not EOF(ff)
        'zeile lesen
        Line Input #ff, strTmp
        strTmp = Trim$(strTmp)
        'Zeile auf Zeichenfolge prüfen
        If LCase(strTmp) Like "<summaryparameter name=*" Then
          'Spaltenzähle hochzählen
          lngC = lngC + 1
          'String aufteilen
          strTmp = Mid(strTmp, 25)
          strTmp = Left(strTmp, Len(strTmp) - 19)
          'nochmal prüfen
          If InStr(1, strTmp, ">") Then
            'in Array schreiben
            If lngIndex = 1 Then vntValues(lngIndex, lngC) = Split(strTmp, """>")(0)
            vntValues(lngIndex + 1, lngC) = Replace(Split(strTmp, """>")(1), ",", ".")
          End If
        End If
      Loop
      Close #ff
    Next
  End If
  
  'Ausgabe
  With Range("A1").Resize(UBound(vntValues, 1), UBound(vntValues, 2))
    .Value = vntValues
    .NumberFormat = "0.00"
    .Columns.AutoFit
  End With
  
End Sub



« Gruß Sepp »

Anzeige
AW: Daten aus XML-Datei direkt einlesen
19.09.2012 10:52:14
VG
Perfekt. Ich bedanke mich herzlich!
Auch für die Kommentare ;-)
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige

Infobox / Tutorial

Daten aus XML-Datei direkt einlesen


Schritt-für-Schritt-Anleitung

Um Daten aus einer XML-Datei in Excel einzulesen, kannst du VBA verwenden. Hier ist eine einfache Schritt-für-Schritt-Anleitung:

  1. Öffne Excel und drücke ALT + F11, um den VBA-Editor zu öffnen.

  2. Füge ein neues Modul hinzu: Klicke im Menü auf Einfügen und wähle Modul.

  3. Kopiere den folgenden Code in das Modul:

    Sub readXML()
       Dim vntFiles As Variant, vntValues() As Variant, vntOut As Variant
       Dim lngIndex As Long, lngC As Long
       Dim ff As Integer
       Dim strTmp As String
    
       vntFiles = Application.GetOpenFilename("XML Dateien (*.xml),*.xml", MultiSelect:=True)
    
       If IsArray(vntFiles) Then
           ReDim vntValues(1 To UBound(vntFiles) + 1, 1 To 22)
           vntValues(1, 1) = "File"
           For lngIndex = LBound(vntFiles) To UBound(vntFiles)
               vntValues(lngIndex + 1, 1) = Mid(vntFiles(lngIndex), InStrRev(vntFiles(lngIndex), "\") + 1)
               ff = FreeFile
               lngC = 1
               Open vntFiles(lngIndex) For Input As #ff
               Do While Not EOF(ff)
                   Line Input #ff, strTmp
                   strTmp = Trim$(strTmp)
                   If LCase(strTmp) Like "<summaryparameter name=*" Then
                       lngC = lngC + 1
                       strTmp = Mid(strTmp, 25)
                       strTmp = Left(strTmp, Len(strTmp) - 19)
                       If InStr(1, strTmp, ">") Then
                           vntValues(lngIndex + 1, lngC) = Split(strTmp, ">")(0)
                           vntValues(lngIndex + 1, lngC + 1) = Replace(Split(strTmp, ">")(1), ",", ".")
                       End If
                   End If
               Loop
               Close #ff
           Next
           With Range("A1").Resize(UBound(vntValues, 1), UBound(vntValues, 2))
               .Value = vntValues
               .NumberFormat = "0.00"
               .Columns.AutoFit
           End With
       End If
    End Sub
  4. Schließe den VBA-Editor und gehe zurück zu Excel.

  5. Führe das Makro aus: Drücke ALT + F8, wähle readXML und klicke auf Ausführen.

Das Skript öffnet ein Dialogfeld, in dem du die XML-Datei auswählen kannst. Der Inhalt wird dann in Excel geladen.


Häufige Fehler und Lösungen

  • Laufzeitfehler 5: Dieser Fehler tritt auf, wenn keine Daten eingelesen wurden. Überprüfe, ob die XML-Datei das richtige Format hat.
  • Fehler beim Öffnen der Datei: Stelle sicher, dass die Datei nicht schreibgeschützt ist und dass du die richtigen Berechtigungen hast.
  • Ungültige Argumente: Überprüfe die Struktur der XML-Datei. Sie muss den erwarteten Tags entsprechen.

Alternative Methoden

Wenn du keine Programmierkenntnisse hast, kannst du auch die integrierte Excel-Funktion verwenden, um XML-Dateien zu importieren:

  1. Wähle in Excel Daten > Abrufen und Transformieren > Aus Datei > Aus XML.
  2. Wähle die XML-Datei aus und folge den Anweisungen im Import-Assistenten.

Diese Methode ist einfacher, bietet jedoch weniger Flexibilität als das Arbeiten mit VBA.


Praktische Beispiele

Hier sind einige Beispiele, wie du mit verschiedenen XML-Daten umgehen kannst:

  • Beispiel 1: Du hast eine XML-Datei mit verschiedenen SummaryParameter. Mit dem oben genannten VBA-Code werden diese Parameter in Excel eingelesen und aufbereitet.
  • Beispiel 2: Wenn du mehrere XML-Dateien hast, kannst du das Skript leicht anpassen, um alle Dateien gleichzeitig zu verarbeiten.

Tipps für Profis

  • Verwende die vba line input utf-8, um sicherzustellen, dass deine XML-Datei korrekt gelesen wird, insbesondere bei nicht-ASCII-Zeichen.
  • Du kannst den Code erweitern, um spezifische Daten aus verschiedenen Tags auszulesen, indem du die Bedingungen in der If-Anweisung anpasst.
  • Überlege, ob du die Daten in eine Excel-Tabelle mit spezifischen Formaten und Stilen exportieren möchtest, um die Lesbarkeit zu verbessern.

FAQ: Häufige Fragen

1. Was mache ich, wenn meine XML-Datei nicht richtig eingelesen wird?
Überprüfe die Struktur der XML-Datei und stelle sicher, dass sie den erwarteten Tags entspricht.

2. Kann ich das Skript auch für andere XML-Dateien verwenden?
Ja, solange die Struktur der XML-Datei den Anforderungen des Skripts entspricht, kannst du es für verschiedene Dateien verwenden.

3. Wo finde ich die XML-Dateien, die ich einlesen möchte?
In vielen Fällen findest du XML-Dateien in Softwareanwendungen oder als Downloads von Websites, die Daten im XML-Format bereitstellen.

4. Gibt es eine Möglichkeit, XML-Daten direkt in Excel zu bearbeiten?
Ja, nachdem die Daten eingelesen wurden, kannst du sie in Excel wie gewohnt bearbeiten.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige