Clever-Excel-Forum

Normale Version: xml-to-excel-via-url
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2 3 4 5
Hi!

ich bekomme es leider (mal wieder) nicht hin den Code einzufügen bzw. zu starten/nutzen.

Könnte mir einer von euch eine Datei hochladen wo der Code und eine Startfunktion hinterlegt sind?

Herzlichen Dank
Hallo Peter,

haben sich wohl einige Postings überschnitten. Siehe Post #29.

Viele Grüße,

Zwenn
Amended:


Code:
Sub M_snb()
  sn = Sheet1.Columns(1).SpecialCells(2)
  ReDim sp(UBound(sn), 29)

  With CreateObject("MSXML2.DOMDocument")
    For j = 1 To UBound(sn)
      .Load sn(j, 1)

      For jj = 0 To 9 Step 3
        sp(j, jj) = .getElementsByTagName("jobkey")(jj).Text
        sp(j, jj + 1) = .getElementsByTagName("jobtitle")(jj).Text
        sp(j, jj + 2) = .getElementsByTagName("url")(jj).Text
      Next
    Next
  End With
   
  Sheet1.Cells(1, 2).resize(UBound(sp), UBound(sp, 2) + 1) = sp
End Sub
Hallo Zwenn!

Wenn ich "xmls einlesen" nutze kommt:

Laufzeitfehler `-2147483638 (80000000a)`:

Automatisierungsfehler
Die für diesen Vorgang erforderlichen Daten sind noch nicht verfügbar

Aber die Url`s sind verfügbar und beinhalten auch Daten.

Gruss

Peter
Hallo Peter,

ich schätze das liegt daran, dass die XML Datei noch nicht ganz geladen wurde, bevor der weitere Code versucht darauf zuzugreifen. Das habe ich vorher nicht bedacht. Ändere mal folgenden Code-Abschnitt:


Code:
'XML-Dokument instanzieren und XML-Dokument einlesen
Set xmlDocument = CreateObject("MSXML2.DOMDocument")
xmlDocument.Load url

Dort fügst Du nur eine Zeile ein:

Code:
'XML-Dokument instanzieren und XML-Dokument einlesen
Set xmlDocument = CreateObject("MSXML2.DOMDocument")
xmlDocument.async = False
xmlDocument.Load url


Der Parameter async sorgt dafür, dass der weitere Code erst ausgeführt wird, wenn die Datei vollständig geladen wurde.

Viele Grüße,

Zwenn
Hi Fennek!

ich bekomme es leider (mal wieder) nicht hin den Code einzufügen bzw. zu starten/nutzen.

Könntest Du mir bitte eine Datei hochladen wo der Code und eine Startfunktion hinterlegt sind?

Herzlichen Dank
Hi Zwenn!

Läuft super (schnell)!!!

Interessanterweise wird der 9. Werte-Block übersprungen. Also der Code erfasst erst Block 1-8 und dann Block 10 und 11 = insgesamt 10 Blöcke.

Die xml sind an der neunten Position aber genauso wie an der achten und zehnten und wie an allen anderen.

Der Code schreibt mir die ersten Werte in Tabelle 2 alle in Zeile 2 statt Zeile 1. Ist das so gewollt? Liegt wahrscheinlich an meiner Vorlage.

Du hattest doch geschrieben, das Du 4 Blöcke mit jeweils 11 getestet hättest. Ich habe aber nur 10 Ergebnisse pro Abfrage. Wie gesagt erster Wert in Zeile 2, letzter Wert in Zeile 11.

P.S. Kann man das so codieren das die 10-Blöcke UNTEREINANDER in Tabelle 2 geschrieben werden. Ohne Leerzeile(n). Und als vierten Wert sicherheitshalber zum Abgleich die passende Url aus Tabelle 1 dazu? Ich habe mal ein Beispiel angehangen.

Vielen Dank
Hallo Peter,

freut mich zu lesen, dass es jetzt funktioniert Smile 

Im Anhang findest Du die aktualisierte Datei. Die Blöcke, wie Du es nennst, werden jetzt inklusive der Herkunfts-URL untereinander geschrieben. Ich hatte mich schon gewundert, warum Du alles nebeneinander haben wolltest. Aber ich kann natürlich auch nicht wissen, wie Du die Daten weiter verarbeitest. Deshalb hatte ich dazu nix gesagt. Die erste Zeile hatte ich leer gelassen, weil ich dachte, Du willst da eine Kopfzeile unterbringen. Jetzt werden die Daten ab der ersten Zeile geschrieben, wie in Deinem Beispiel. Zwar könnte man auch eine "Block-Farbgebung" einbauen, das habe ich jetzt aber nicht umgesetzt.

Die Anzahl der auszulesenden Datensätze wird über die Variable anzahlDatensaetze in der Prozedur AlleXMLsAbrufen() gesteuert. Die Zahl, die Du dafür einträgst, wird genommen (falls weniger vorhanden, natürlich nur soviele, wie vorhanden). Trägst Du dort eine 0 ein oder kommentierst die Zeile aus, werden alle verfügbaren Datensätze einer XML-Datei in die Ergebnis-Tabelle eingetragen.

Code:
anzahlDatensaetze = 10 'optional, wenn weggelassen, werden alle eingelesen

Warum bei Dir Nr. 9 ausgelassen wird kann ich nicht sagen. Sofern die Daten in einem result-Tag-Block gekapselt sind, gilt der letzte Satz eines Technikers: "Das kann nicht sein." Die Erklärung warum, also was genau das Makro eigentlich macht, spare ich mir der fortgeschrittenen Stunde geschuldet an dieser Stelle mal. Bei meinen künstlich erzeugten 4 Dateien mit je 11 Datensätzen ist es auch so, dass nix übersprungen wird. Es werden immer die ersten 10 eingelesen, wie erwartet. Um das Phänomen untersuchen zu können, bräuchte ich eine der betroffenen XML-Dateien.

Viele Grüße,

Zwenn
Hi Zwenn!

Klappt (fast) alles super und schnell! 

200 schafft der Code in 6, 100 in 3 und 50 in 1,5 Minuten. Also sehr ähnliche Zeiten.

Nur werden ja nach Abfragemenge manche xml nicht abgefragt.

Bei 50 fehlen im Durchschnitt 2, bei 100 sind es 6 und bei 200 sind es 14.

Wenn ich diese (nicht abgefragten) xml einzeln abrufe, klappt es immer, weil diese ja vorhanden sind und alle genügend = mehr als 10 Blöcke haben.

Wenn ich die Durchgänge wiederhole, sind es auch immer andere xml die nicht abgefragt werden. Und andere Mengen. Mal fehlt die gleich zweite Abfrage, mal die Nummer 78 und 91 usw. Also immer andere Positionen.

Daraus schließe ich das die Abfragezeit zu kurz ist und weil die Daten online abgefragt werden.

Kann man das Abfrageintervall irgendwie definieren/erhöhen? Auf z.B. 5 oder 10 Sekunden pro Abfrage, weil zur Zeit s.o. ruft der Code im Durchschnitt alle 2-3 Sekunden ab und das ist wohl zu schnell.

Vielen Dank

Gruss

Peter
Hallo Peter,

warum Dateien ausgelassen werden kann ich nicht sagen. Vermutlich ist es, wie Du vermutest und es liegt an der Verbindung oder dem Server, von dem abgerufen wird. Vielleicht ist darauf auch das Fehlen von Block Nr. 9 zurückzuführen. Keine Ahnung. Ich gehe davon aus, dass die XML-Dateien da nicht fertig liegen, sondern generiert werden wenn Du sie abrufst.

Du kannst zwischen allen Abrufen eine beliebig lange Pause einbauen. Erweitere den Code in der ersten Prozedur AlleXMLsAbrufen() um die Wartezeit-Zeile(n) und probiere aus, wie sich Änderungen in der Wartezeit auswirken. Ich habe 5 Sekunden voreingestellt:


Code:
...
   Call EineXMLEinlesen(url, ergebnisTabelle, aktuelleZeile, aktuelleSpalteEins, anzahlDatensaetze)
   zeileURLs = zeileURLs + 1
   
   'Wartezeit vor dem nächsten XML-Abruf
   'Application.Wait (Now + TimeSerial(pause_stunden, pause_minuten, pause_sekunden))
   Application.Wait (Now + TimeSerial(0, 0, 5))
 Loop
End Sub


Viele Grüße,

Zwenn
Seiten: 1 2 3 4 5