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
En su función
sendAsyncRequest
reemplace la línea de retorno comosendAsyncRequest = "anything other than numbers"
En su
ReadyStateChangeHandler
, reemplaceApplication.Range(cellAddress).Value = XMLHttpReq.responseText ''return responseText to cell
por
cellDisplayText = XMLHttpReq.responseText
Range(cellAddress).NumberFormat = "0;0;0;""" & cellDisplayText & """"