Abbruch eines Web-Abfrage-Makros verhindern durch gezieltes Error-Handling

Ein VBA-Makro, das automatisch Daten aus dem Web zu einer Liste von URLs abrufen soll, bricht mittendrin ab, weil eine ungültige URL darunter ist oder eine dieser Seiten gerade nicht antwortet. Wie lässt sich das verhindern?

Besser ist es, wenn das Makro anstatt mit Fehler abzubrechen einfach bei der nächsten URL weitermacht. Prima wäre es noch, wenn eine Markierung angebracht werden könnte, sofern ein Abruf nicht geklappt hat.

Die Ausgangssituation

Wir haben eine Exceldatei mit einem Makro, welches unter Benutzung einer QueryTable Daten aus dem Web abruft. Wie das genau funktioneirt, ist in diesem Artikel beschrieben: Daten aus dem Internet automatisch in ein Excel-Sheet übertragen

Innerhalb dieses Makros erzeugen wir nun eine QueryTable und rufen damit die Daten einer URL ab, die in dem Moment in der String-Variablen eineURL steht. Das könnte in etwa so aussehen:

' qt ist als QueryTable deklariert, shW als Worksheet bzw. es wurde ein Worksheet zugewiesen
' ...
Set qt = shW.QueryTables.Add("URL;" + eineURL, shW.Cells(1, 1))
With qt
    'verschiedene Parameter von qt je nach Bedarf setzen
    ' ...
    .Refresh (False)   'URL aufrufen
End With

Beim .Refresh kann das Ganze nun aussteigen.

Die Lösung

Das einfachste Error-Handling, das hier möglich ist, ist folgendes: Unmittelbar vor der .Refresh-Zeile schalten wir das allgemeine Error-Handling einfach aus durch

On Error Resume Next

Damit sagen wir: Egal was passiert, mach einfach in der nächsten Code-Zeile weiter. Natürlich kann die Lösung nicht darin bestehen, einfach alle Fehler zu ignorieren. Nach dem .Refresh-Aufruf prüfen wir natürlich genau nach, ob es schief gagangen ist und reagieren in dem Fall darauf. Das geht z.B. so:

If Err.Number <> 0 Then
    Err.Clear
    ' hier kommt der Code hin, der in dem Fall ablaufen soll,
    ' z.B. kann man eine Markierung in der Zeile des Tabellenblattes anbringen
End If

Wenn ein Fehler aufgetreten ist, kann man das daran erkennen, dass in Err.Number ein Wert ungleich 0 steht. Wir setzen diesen durch Err.Clear wieder zurück, da wir es nun wissen und selbst drauf reagieren, was wir mit darauffolgendem Code tun.
Nun fehlt noch das Wiedereinschalten der „normalen“ Fehlerbahandlung durch

On Error GoTo 0

Wir möchten ja schließlich nicht, dass alle Fehler, die nun noch auftreten könnten, immer ignoriert werden. Wir wollten ja nur gezielt das Auftreten eines Fehlers beim Schiefgehen einer Web-Abfrage abfangen, was wir hiermit getan haben.

Schreibe einen Kommentar

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