Tengo esta función en VBA, que he usado con éxito antes en Excel para recuperar datos de una URL:
'========================================================
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()
'========================================================
Ahora estoy llamando a esta función desde otra función, a la que llamo desde una consulta en Access. Cuando hago eso, la llamada a esta función se bloquea si intento ejecutarla sin interrupciones. Pero si establezco un punto de interrupción en la línea:
Do While oRequest.ReadyState <> nProcessComplete
y luego decirle a VBA que continúe, luego se ejecuta. Sin embargo, si elimino ese punto de interrupción y establezco un punto de interrupción en la línea:
sResponse = .responseText
luego se cuelga.
Entonces, parece que cuando se llama a esta función desde Access, se bloquea en el bucle a menos que un punto de interrupción le indique que haga una pausa antes de ingresar al bucle.
Intenté automatizar la pausa insertando una llamada a una función que pausa VBA por un tiempo aleatorio. Eso no impidió que la función se colgara.
Resumen:
- La función funcionó en el pasado en Excel.
- Funciona en Access si está pausado por un punto de interrupción al comienzo del ciclo.
- Se bloquea si se llama en Access sin ese punto de interrupción.
¿Qué podría estar causando que esta función se cuelgue en Access y qué podría cambiar para que funcione?