JSON呼び出しをマクロでスクリプト化することは可能ですか?
API接続を介してJSON文字列を取得したい。問題はExcelがパラメーターをHTML文字列で渡すことを期待しているように見えますが、JSONはパラメーターをHTML本文で渡します。何か案は?
これはVBAなので、COMを使用してxmlhttprequest
を呼び出しますが、VBAのシングルスレッド実行環境を混乱させないように同期的に使用します。post
およびget
この方法での要求は次のとおりです。
'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
したがって、サーバーの応答を返すために上記を呼び出すことができます:
Dim request As New syncWebRequest
request.ajaxGet "http://localhost/ClientDB/AllClients?format=json"
Dim json as string
json = request.Response
ここでの問題は、JSON文字列を直接操作するよりも、何らかの方法でサーバーから返されたデータを読み取れるようにすることです。私のために働いたのは、 VBA-JSON (google code export here )COMタイプCollection
を使用してJSON配列を処理し、Dictionary
を使用することですメンバーとその宣言を処理します。パーサーファクトリメソッドParse
を使用すると、基本的にこれらの辞書のコレクションを非常に簡単に作成できます。
これで、JSONを解析できます。
[{"Name":"test name","Surname":"test surname","Address":{"Street":"test street","Suburb":"test suburb","City":"test city"}}]
次のようなものに:
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
それは素晴らしいことですが、データを編集してポストバックできるようなものはどうでしょうか?サーバーがJSONバックを受け入れると仮定すると、上記の[Collection/Dictionary] JSONデータからJSON文字列を作成するメソッドtoString
もあります。
このために.NET Excel-Addinを作成しました。これは一般的なExcel JSONクライアントであり、JSONオブジェクトをhttp経由でExcelに直接ストリーミングします。
ドキュメントとインストール手順はここにあります: http://Excel-requests.pathio.com/en/master/
GitHubリンクは次のとおりです。 https://github.com/ZoomerAnalytics/Excel-requests