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
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
Folgende(r) 1 Nutzer sagt Danke an Zwenn für diesen Beitrag:1 Nutzer sagt Danke an Zwenn für diesen Beitrag 28 • PeterN
29.03.2019, 18:34 (Dieser Beitrag wurde zuletzt bearbeitet: 29.03.2019, 18:35 von PeterN.)
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.
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
Folgende(r) 1 Nutzer sagt Danke an Zwenn für diesen Beitrag:1 Nutzer sagt Danke an Zwenn für diesen Beitrag 28 • PeterN
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.
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:
'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
Folgende(r) 1 Nutzer sagt Danke an Zwenn für diesen Beitrag:1 Nutzer sagt Danke an Zwenn für diesen Beitrag 28 • PeterN