xmlhttp parser parsejson microsoft leer example excel vba asynchronous xmlhttprequest

excel - parser - ¿Cómo envía VBA una solicitud Async XMLHTTP?



vba json parser example (2)

Para obtener datos de un servicio web en Excel, he creado una función de complemento para proporcionarlo; el usuario solo necesita escribir en la celda: =sendRequest("http://webservice.com")

Tengo 2 archivos de Excel para demostrar la sending request en dos métodos: 1. sincrónico y 2. asincrónico

En el método de sync , la función puede enviar solicitudes y obtener datos de forma normal. Pero, si tenemos 100, 200 celdas que lo llamen, Excel tendrá una gran cantidad de tiempo esperando; que también hace que Exel no esté respoding .

Mi solución actual para esto es usar el método async siguiente código

Public Function sendAsyncRequest(URL) ''other statement '' Get some stuff asynchronously. xmlHttpRequest.Open "GET", URL, True xmlHttpRequest.send sendAsyncRequest = xmlHttpRequest.responseText End Function

Pero el valor de la celda siempre es cero 0 en lugar de texto de respuesta.

Debo usar mi clase de controlador para vincularlo con el xmlHttpRequest object OnReadyStateChange of xmlHttpRequest object para establecer el texto de respuesta en la celda. Pero luego, también borra las fórmulas de las células.

Entonces mi pregunta es ¿Cómo cambiar el texto de la pantalla de la celda sin cambiar su fórmula?

También recibo con agrado otra solución para enviar solicitudes y obtener el valor de retorno con el método async .


Como la desventaja de la solución indicada aquí , la mejor manera de obtener el valor de retorno asíncrono para la función es 1) almacenar en caché el request''s url => returned value su request''s url => returned value a una colección / dicitonario, y luego 2) actualizar su fórmula


Este es mi archivo de solución para su pregunta; de hecho, se actualiza desde su archivo de prueba asíncrona .

En función de esta discusión , puede change the display text of cell without changing its formula utilizando Range (yourCellAddress) .NumberFormat = "0; 0; 0;" "Valor para mostrar" ""

Entonces, para su pregunta, la solución es

  1. En su función sendAsyncRequest reemplace la línea de retorno como

    sendAsyncRequest = "anything other than numbers"

  2. En su ReadyStateChangeHandler , reemplace

    Application.Range(cellAddress).Value = XMLHttpReq.responseText ''return responseText to cell

por

cellDisplayText = XMLHttpReq.responseText Range(cellAddress).NumberFormat = "0;0;0;""" & cellDisplayText & """"