Hallo Forum,
ich hab bereits einbisschen Erfahrungen mit VBA machen können, aber hauptsächlich in öffnen, entpacken, einfügen von Formeln, und neu speichern von Dateien. Aber hier komme ich nun leider nicht mehr weiter. In einem anderen Forum hab ich bisher leider noch keine Antwort auf meine Problem bekommen, deshalb versuche ich es nun hier.
Ich möchte aus mehreren XML Dateien für eine private Auswertung verschiedene Daten auslesen direkt aus der XML. Jedoch bekomme ich es nicht hin das die Codes in der Excel Tabelle drin stehen: Folgend die XML welche ich habe:
---------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<product type="Example" creator="System" season="W" Year="2018" organizer="Frankreich" name="Martin Geiger" language="fr" category="4" category2="" cityName="Home" externalID="0017508" Code="H" bookingSequence="ABC1231" validFrom="01.11.2018" validTo="31.03.2019" lastChange="2018-09-11 12:08:15" delete="">
<Key ID="123456" catalogID="0"></Key>
<catalogue page="184">Winter</catalogue>
<additionalCode bookingSequence="ABC1234"</additionalCode>
<additionalCode bookingSequence="ABC1235"</additionalCode>
<additionalCode bookingSequence="ABC1236"</additionalCode>
<additionalCode bookingSequence="ABC1237"</additionalCode>
....
....
....
....
....
</product>
----------------------------
Hier der VBA Code welchen ich bereits angefangen hab anzupassen:
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 6000)
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 "<additionalcode bookingsequence=*" Then
'Spaltenzähle hochzählen
lngC = lngC + 1
'String aufteilen
strTmp = Mid(strTmp, 34)
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
----------------------
Ich glaube das in dem folgenden Teil irgendwo eine Anpassung fehlt damit es auch funktioniert:
'String aufteilen
strTmp = Mid(strTmp, 34)
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), ",", ".")
Jedoch weiss ich nicht was ich hier entsprechend noch anpassen muss damit es funktioniert oder wie der Code auszusehen hat. Kann mir hier jemand weiterhelfen?
Danke & viele Grüsse,
Martin
|