Warum bleibt diese VBA-Funktion zum Abrufen von Daten hängen?

Warum bleibt diese VBA-Funktion zum Abrufen von Daten hängen?

Ich habe diese Funktion in VBA geschrieben, um Daten von einer URL abzurufen. Ich rufe sie von einer anderen Funktion aus auf, die in einer Access-Abfrage aufgerufen wird. Der Code wurde aus einem Artikel übernommen, der in den Kommentaren zum Code zitiert wird:

'========================================================
Public Function sURLfetch(ByVal sURL As String) As String
'========================================================
' Return data found at a URL.

' From "www.MyExcelGenius.com/getting-data-from-a-website-in-json-format-using-vba/".
' Requires reference "Microsoft XML, v6.0".

Const bRunAsynch As Boolean = True
Const nProcessComplete As Integer = 4

Dim oRequest As MSXML2.XMLHTTP60
Set oRequest = New MSXML2.XMLHTTP60

Dim sResponse As String

With oRequest
    .Open "get", sURL, bRunAsynch
    .setRequestHeader "Content-Type", "application/json"
    .send

    Do While oRequest.ReadyState <> nProcessComplete
        DoEvents
      Loop
    
    sResponse = .responseText
  End With

sURLfetch = sResponse

'========================================================
End Function        ' sURLfetch()
'========================================================

Wenn diese Funktion aufgerufen wird, bleibt VBA hängen. Aber hier ist das Seltsame: Wenn ich einen Haltepunkt in der Zeile setze:

Do While oRequest.ReadyState <> nProcessComplete

und dann VBA anweisen, von dort aus fortzufahren, läuft es einwandfrei und gibt das gewünschte Ergebnis zurück. Es tut dies immer wieder und gibt die richtige Ergebnisfolge zurück, solange der Code an diesem Haltepunkt unterbrochen und dann fortgesetzt wird. Wenn ich jedoch diesen Haltepunkt entferne und stattdessen einen Haltepunkt in der Zeile direkt nach der Schleife setze:

sResponse = .responseText

dann hängt es und ich bekomme nichts.

Aus irgendeinem Grund bleibt diese Funktion in der Schleife hängen, sofern sie nicht durch einen Haltepunkt angewiesen wird, vor dem Eintritt in die Schleife anzuhalten.

Der Zweck der Schleife besteht darin, sicherzustellen, dass der Abrufvorgang abgeschlossen ist, bevor die Antwort aufgezeichnet wird. Ich habe die Funktionsweise des Codes beobachtet und die Schleife wird normalerweise null- oder einmal wiederholt. Wenn sie wiederholt wird, bedeutet dies, dass der Abruf unvollständig war und beendet werden musste. Die Schleife ist also für das, was ich abrufe, erforderlich. Und aus irgendeinem Grund scheint sie einwandfrei zu funktionieren, solange davor ein Haltepunkt vorhanden ist, bleibt aber ansonsten auf mysteriöse Weise hängen.

Die DoEventsFunktion, also der gesamte Inhalt der Schleife, sagt VBA lediglich, dass das Betriebssystem alles tun soll, was es gerade tut, während die Schleife ausgeführt wird. Dieser Funktionsaufruf befindet sich in derursprünglicher Codehier angepasst und es gibt Dokumentation der Funktion vonMicrosoftUndwellsr.

Ich habe versucht, die Pause zu automatisieren, indem ich einen Aufruf einer Funktion eingefügt habe, die VBA für eine zufällige Zeit anhält. Das hat das Hängenbleiben der Funktion nicht verhindert.

Zusammenfassung:

  • Die Funktion funktioniert, wenn sie durch einen Haltepunkt am Anfang der Schleife angehalten wird.
  • Es bleibt hängen, wenn es ohne Haltepunkt oder mit einem Haltepunkt nach dieser Schleife aufgerufen wird.

Was könnte die Ursache für das Hängenbleiben dieser Funktion sein und was könnte ich ändern, damit sie funktioniert?

Antwort1

Das Problem scheint darin zu liegen, dass der asynchParameter im OpenBefehl auf gesetzt wurde True. Diese Einstellungermöglicht das Anhalten der Anfrage, bevor sie abgeschlossen ist, was die DoEventsSchleife notwendig machte. Also habe ich versucht, diesen Parameter zu ändern Falseund die Schleife auszukommentieren. Danach scheint die Funktion einwandfrei zu funktionieren.

Ich weiß nicht, warum dieursprünglicher Codeused asynch= Trueund die Schleife. Das scheint der Grund gewesen zu sein, warum die Funktion nicht funktioniert hat.

verwandte Informationen