Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
1276to1280
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

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

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
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

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

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 ;-)

18 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige