Est-il possible de scripter des appels JSON dans une macro?
Je souhaite obtenir une chaîne JSON via une connexion API. Il semble que le problème soit qu'Excel attend que les paramètres soient passés dans la chaîne HTML, mais JSON transmet les paramètres dans le corps HTML. Des idées?
Comme il s'agit de VBA, j'utiliserais COM pour appeler xmlhttprequest
mais l'utiliser de manière synchrone pour ne pas perturber l'environnement d'exécution à thread unique de VBA, Un exemple de classe qui illustre un post
et get
demande de cette manière suit:
'BEGIN CLASS syncWebRequest
Private Const REQUEST_COMPLETE = 4
Private m_xmlhttp As Object
Private m_response As String
Private Sub Class_Initialize()
Set m_xmlhttp = CreateObject("Microsoft.XMLHTTP")
End Sub
Private Sub Class_Terminate()
Set m_xmlhttp = Nothing
End Sub
Property Get Response() As String
Response = m_response
End Property
Property Get Status() As Long
Status = m_xmlhttp.Status
End Property
Public Sub AjaxPost(Url As String, Optional postData As String = "")
m_xmlhttp.Open "POST", Url, False
m_xmlhttp.setRequestHeader "Content-type", "application/x-www-form-urlencoded"
m_xmlhttp.setRequestHeader "Content-length", Len(postData)
m_xmlhttp.setRequestHeader "Connection", "close"
m_xmlhttp.send (postData)
If m_xmlhttp.readyState = REQUEST_COMPLETE Then
m_response = m_xmlhttp.responseText
End If
End Sub
Public Sub AjaxGet(Url As String)
m_xmlhttp.Open "GET", Url, False
m_xmlhttp.setRequestHeader "Connection", "close"
m_xmlhttp.send
If m_xmlhttp.readyState = REQUEST_COMPLETE Then
m_response = m_xmlhttp.responseText
End If
End Sub
'END CLASS syncWebRequest
Alors maintenant, vous pouvez appeler ce qui précède pour vous renvoyer la réponse du serveur:
Dim request As New syncWebRequest
request.ajaxGet "http://localhost/ClientDB/AllClients?format=json"
Dim json as string
json = request.Response
Le problème ici est que nous voulons pouvoir lire les données renvoyées par le serveur d'une manière ou d'une autre, plus que de manipuler directement la chaîne JSON. Ce qui a fonctionné pour moi, c'est d'utiliser VBA-JSON (exportation de code Google ici ) COM type Collection
pour gérer les tableaux JSON et Dictionary
pour gérer les membres et leurs déclarations, avec une méthode de fabrique d'analyseurs Parse
qui rend la création de ces collections de dictionnaires beaucoup plus simple.
Alors maintenant, nous pouvons analyser le JSON:
[{"Name":"test name","Surname":"test surname","Address":{"Street":"test street","Suburb":"test suburb","City":"test city"}}]
en quelque chose comme ce qui suit:
Set clients = parser.parse(request.Response)
For Each client In clients
name = client("Name")
surname = client("Surname")
street = client("Address")("Street")
suburb = client("Address")("Suburb")
city = client("Address")("City")
Next
C'est bien, mais qu'en est-il de la possibilité de modifier et de publier les données? Eh bien, il existe également une méthode toString
pour créer une chaîne JSON à partir des données JSON [Collection/Dictionary] ci-dessus, en supposant que le serveur accepte JSON en retour.
J'ai écrit un .NET Excel-Addin pour cela. Il s'agit d'un client JSON Excel générique qui diffuse n'importe quel objet JSON directement dans Excel via http.
Les documents et les instructions d'installation peuvent être trouvés ici: http://Excel-requests.pathio.com/en/master/
Et voici le lien GitHub: https://github.com/ZoomerAnalytics/Excel-requests