Bessere Performance bei vielen Web-Abfragen hintereinander

Wie kann ich es schaffen, dass die Performance bei sehr vielen Web-Abfragen hintereinander nicht nachlässt, sondern das Ganze schön gleichmäßig durchläuft?

Ich hatte in vorhergehenden Artikeln erklärt, wie man per Excel mittels QueryTable automatisiert Daten aus dem Internet abrufen kann, um sie danach in eigenen Excel-Anwendungen zu nutzen. Dazu hatte ich gezeigt, wie das QueryTable-Objekt einmal initialisiert und danach wiederholt verwendet wird. Bei sehr vielen Web-Abfragen wird die Sache auf diese Art und Weise nach hinten heraus immer langsamer. Ich zeige hier Abhilfe.

Das Initialisieren einer Web-Abfrage

So kann man eine QueryTable vorbereiten:

Set shW = Sheets("Web")  'Hilfs-Tabellenblatt, auf dem das Abfrageergebnis landen soll
Set qt = shW.QueryTables.Add("URL;", shW.Cells(1, 1))  'Abfrage anlegen, konkrete URL kommt später
With qt
    'ein paar Parameter, die ein paar Einzelheiten zur Abfrage festlegen
   .BackgroundQuery = False
   .RefreshStyle = xlInsertDeleteCells
   .WebSelectionType = xlEntirePage
   .WebFormatting = xlWebFormattingNone
   .WebDisableDateRecognition = True
End With

Das Abrufen der Daten

So lässt sich die vorbereitete QueryTable nutzen, um z.B. Daten von ariva.de zur Adidas-Aktie aubzurufen:

With qt
   .Connection = "UrL;http://www.ariva.de/adidas-aktie/bilanz-guv"
   .Refresh (False)
End With

Die Daten landen dadurch auf dem Tabellenblatt „Web“ und können ausgelesen und weiterverarbeitet werden.

Nun soll das jedoch nicht nur für die eine Aktie, sondern für eine ganze Liste von Aktien passieren. Man würde also das Abrufen und Weiterverarbeiten der Daten aus dem Web in einer Schleife anordnen, etwa so:

'ersten urlTeil holen
' ...
Do Until urlTeil = ""
   With qt
     .Connection = "URL;http://www.ariva.de/" + urlTeil + "/bilanz-guv"
     .Refresh (False)
   End With
   'Daten auslesen und verarbeiten
   ' ...
   'nächsten urlTeil holen
   ' ...
Loop

Das Problem

Bei einer größeren Menge abzurufender Web-Seiten wird das Ganze immer langsamer. Man merkt es schon bei Größenordnungen um die 50 Schleifendurchläufe, bei mehreren hundert bis tausend scheint es regelrecht einzuschlafen. Es ist, als ob es sich „vollsaugt“. Wahrscheinlich ist die QueryTable so beschaffen, dass da irgendwie alles gecacht wird.

Die Lösung

Die Lösung besteht darin, einfach bei jedem Schleifendurchlauf eine völlig neue QueryTable zu verwenden, natürlich nachdem man bereits vorhandene „entsorgt“ hat. Das geht etwa so:

'ersten urlTeil holen
' ...
Do Until urlTeil = ""
    'Worksheet "Web" leeren, QueryTables entfernen
    shW.Cells.Clear
    For Each qt In shW.QueryTables
        qt.Delete
    Next
    'neue QueryTable erzeugen und URL gleich abrufen
    Set qt = shW.QueryTables.Add("URL;http://www.ariva.de/" + urlTeil + "/bilanz-guv", shW.Cells(1, 1))
    With qt
        .BackgroundQuery = False
        .RefreshStyle = xlInsertDeleteCells
        .WebSelectionType = xlEntirePage
        .WebFormatting = xlWebFormattingNone
        .WebDisableDateRecognition = True
        .Refresh (False)  'Dadurch wird die Web-Seite geladen. 
    End With
    'Daten auslesen und verarbeiten
    ' ...
    'nächsten urlTeil holen
    ' ...
Loop

Das sieht zwar nicht nach sehr elegantem Code aus, hilft aber.

Ein größeres Projekt, in dem das und anderes umgesetzt wurde, ist mein Excel-Tool zur Levermann-Aktienstrategie
Sparen, anlegen, frei sein

Neben anderen interessanten Inhalten stelle ich mein Levermann-Tool auf meinem Blog „Sparen, anlegen, frei sein“ unter https://petrawolff.blog zur Verfügung.

3 Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.