VBA 发送 GET/POST 请求并解析 json 数据
1. 发送 GET 请求
以GET方式上传数据
Function uploadData1(ByVal url As String)
Dim http
Set http = CreateObject("Microsoft.XMLHTTP")
http.Open "GET", url, False
http.send
uploadData1 = http.Status
End Function
2. 发送 POST 请求
以POST方式上传数据
Function uploadData2(ByVal url As String, ByVal data As String)
Dim http
Set http = CreateObject("Microsoft.XMLHTTP")
http.Open "POST", url, False
http.setRequestHeader "CONTENT-TYPE", "application/json"
http.send (data) data为JSON字符串, 评论区有人说需要对data加小括号, 我自己的情况是加不加都可以, 这里姑且加上
uploadData2 = http.Status
End Function
3. 发送 GET 请求并解析返回的 josn 数据
Function getData(ByVal url As String, sht As Worksheet, ByVal rowNum As Integer, ByVal colNum As Integer)
Dim http As Object
Set http = CreateObject("Microsoft.XMLHTTP") 创建 http 对象以发送请求
http.Open "GET", url, False 设置请求地址
http.setRequestHeader "CONTENT-TYPE", "application/x-www-form-urlencoded" 设置请求头
http.send 发送请求
If http.Status = 200 Then
Dim json$ 定义字符串 json
json = http.responseText 获取相应结果
接下来是解析 json
Set objSC = CreateObject("ScriptControl")
Set objSC = CreateObjectx86("MSScriptControl.ScriptControl") 在64位版Excel中的处理方法
objSC.Language = "JScript"
strJSON = "var json=" & json & ";"
objSC.AddCode (strJSON) 将 json 由字符串解析为对象
Dim j, k, l
Dim arr() 定义一个数组来接收 json 中的数据
ReDim arr(1 To rowNum, 1 To colNum) 可以提高向 Excel 单元格填充数据的效率
indexArr = [a,b, ...] 这个数组表示的是后端返回的数据表的列名组成的列表, 用于在 json 对象中索引每列数据
On Error GoTo err_handle 错误处理
For j = 1 To rowCount
For k = 1 To colCount
Dim kk
kk = "json.obj[" + CStr(j - 1) + "]." + indexArr(k - 1)
arr(j, k) = objSC.eval(kk)
Next
l = l + 1
Next
err_handle:
If l = "" Then
Exit Function
Else
sht.Range(Cells(1, 1), Cells(l, colCount)).Value2 = arr 将数组填入 Excel 表格
End If
End If
End Function
需要注意的是, 在64位版Excel中, CreateObject方法不再适用, 此时需要引入下面的代码
Function CreateObjectx86(Optional sProgID, Optional bClose = False)
Static oWnd As Object
Dim bRunning As Boolean
#If Win64 Then
bRunning = InStr(TypeName(oWnd), "HTMLWindow") > 0
If bClose Then
If bRunning Then oWnd.Close
Exit Function
End If
If Not bRunning Then
Set oWnd = CreateWindow()
oWnd.execScript "Function CreateObjectx86(sProgID): Set CreateObjectx86 = CreateObject(sProgID): End Function", "VBScript"
End If
Set CreateObjectx86 = oWnd.CreateObjectx86(sProgID)
#Else
Set CreateObjectx86 = CreateObject("MSScriptControl.ScriptControl")
#End If
End Function
Function CreateWindow()
Dim sSignature, oShellWnd, oProc
On Error Resume Next
sSignature = Left(CreateObject("Scriptlet.TypeLib").GUID, 38)
CreateObject("WScript.Shell").Run "%systemroot%syswow64mshta.exe about:""about:<head><script>moveTo(-32000,-32000);document.title=x86Host</script><hta:application showintaskbar=no /><object id=shell classid=clsid:8856F961-340A-11D0-A96B-00C04FD705A2><param name=RegisterAsBrowser value=1></object><script>shell.putproperty(" & sSignature & ",document.parentWindow);</script></head>""", 0, False
Do
For Each oShellWnd In CreateObject("Shell.Application").Windows
Set CreateWindow = oShellWnd.GetProperty(sSignature)
If Err.Number = 0 Then Exit Function
Err.Clear
Next
Loop
End Function
然后将 CreateObject方法改为CreateObjectx86即可
