Can';t使用WebHelpers从json填写excel电子表格

Can';t使用WebHelpers从json填写excel电子表格,json,excel,vba,web-scraping,Json,Excel,Vba,Web Scraping,使用WebHelpers使用VBA从JSON填充表格时遇到问题。可以在此处访问JSON:。这个表非常简单,只有六列和大约8k行 代码如下: Sub LoadRLSiteData() Dim helperData As Object Dim helperDict As Dictionary Set helperData = WebHelpers.ParseJson(getXMLPage("http://54.152.85.66:5000/get-product-info")) Debug.Pri

使用WebHelpers使用VBA从JSON填充表格时遇到问题。可以在此处访问JSON:。这个表非常简单,只有六列和大约8k行

代码如下:

Sub LoadRLSiteData()
Dim helperData As Object
Dim helperDict As Dictionary
Set helperData = 
WebHelpers.ParseJson(getXMLPage("http://54.152.85.66:5000/get-product-info"))
Debug.Print "helperData has " & helperData.Count & " items"
' HERE YOU SHOULD LOOP OVER helperData AND PUT INTO SHEET "Helper"
End Sub

Function getXMLPage(link) As String
On Error GoTo recovery
Dim retryCount As Integer
retryCount = 0
Dim ie As MSXML2.XMLHTTP60
Set ie = New MSXML2.XMLHTTP60
the_start:
ie.Open "GET", link, False
ie.setRequestHeader "Content-type", "application/json"
ie.send

While ie.readyState <> 4
    DoEvents
Wend

Debug.Print " "
Debug.Print "MSXML HTTP Request to " & link
Debug.Print ie.Status; "XMLHTTP status "; ie.statusText; " at "; Time
getXMLPage = ie.responseText
Exit Function
recovery:
retryCount = retryCount + 1
Debug.Print "Error number: " & Err.Number _
        & " " & Err.Description & " Retry " & retryCount
        Application.StatusBar = "Error number: " & Err.Number _
        & " " & Err.Description & " Retry " & retryCount

If retryCount < 4 Then GoTo the_start Else Exit Function
End Function
Sub-LoadRLSiteData()
作为对象的Dim helperData
Dim helperDict作为字典
设置帮助数据=
WebHelpers.ParseJson(getXMLPage(“http://54.152.85.66:5000/get-产品信息“))
Debug.Print“helperData has”&helperData.Count&“items”
'这里您应该循环helperData并将其放入工作表“Helper”
端接头
函数getXMLPage(链接)作为字符串
关于错误转到恢复
Dim retryCount为整数
retryCount=0
尺寸ie为MSXML2.XMLHTTP60
设置ie=New MSXML2.XMLHTTP60
开始时:
即打开“获取”,链接,错误
ie.setRequestHeader“内容类型”、“应用程序/json”
送
而ie.readyState 4
多芬特
温德
调试。打印“”
调试。打印“MSXML HTTP请求到”&链接
调试。打印状态;“XMLHTTP状态”;即状态文本;“在”;时间
getXMLPage=ie.responseText
退出功能
恢复:
retryCount=retryCount+1
调试。打印“错误号:&错误号”_
&“”&Err.Description&“Retry”&retryCount
Application.StatusBar=“错误号:”&错误号_
&“”&Err.Description&“Retry”&retryCount
如果retryCount<4,则转到_start Else Exit函数
端函数
以下是表格的外观:

ParseJson(getXMLPage(“”)返回一个对象,该对象似乎是九个字典的集合,但我似乎无法解释如何访问字典中的项,以便将它们放入工作表中

我根据QHarr的回答修改了代码,如下所示:

Option Explicit
Sub LoadRLSiteData()
Dim newHeaders() As Variant
newHeaders = Array("category", "products_category", "products_master_prod_id", "products_page_name_dub", "products_product_webcat", "products_url")
GetInfo "Helper Sample", "http://54.152.85.66:5000/get-product-info", newHeaders
newHeaders = Array("category", "products_category", "products_master_prod_id", "products_page_name_dub", "products_product_webcat", "products_url")
GetInfo "Images Sample", "http://54.152.85.66:5000/query-missing-images", newHeaders
newHeaders = Array("category", "problem", "url")
GetInfo "Problems Sample", "http://54.152.85.66:5000/get-problems", newHeaders
End Sub
Public Sub GetInfo(mySheet As String, link As String, myHeaders As Variant)
Dim helperData As Object
Dim headers(), item As Object, results(), key As Variant
Dim subItem As Object, r As Long, c As Long, cat As String
Worksheets(mySheet).Activate
Set helperData = WebHelpers.ParseJson(getXMLPage(link))
headers = myHeaders
ReDim results(1 To 100000, 1 To UBound(headers) + 1)
r = 1
Debug.Print "GetInfo unpacking JSON dictionaries"
For Each item In helperData                  'col of dict
    DoEvents
    cat = item("category")
    For Each subItem In item("products")
        c = 2
        results(r, 1) = cat
        For Each key In subItem.Keys
            results(r, c) = subItem(key)
            c = c + 1
        Next
        r = r + 1
    Next
Next
Debug.Print "GetInfo loading values to worksheet"
ActiveSheet.Cells(1, 1).Resize(1, UBound(headers) + 1) = headers
ActiveSheet.Cells(2, 1).Resize(UBound(results, 1), UBound(results, 2)) = results
Debug.Print "GetInfo finished"
End Sub
Function getXMLPage(link) As String
On Error GoTo recovery
Dim retryCount As Integer
retryCount = 0
Dim ie As MSXML2.XMLHTTP60
Set ie = New MSXML2.XMLHTTP60
the_start:
ie.Open "GET", link, False
ie.setRequestHeader "Content-type", "application/json"
ie.send

While ie.readyState <> 4
    DoEvents
Wend

Debug.Print " "
Debug.Print "MSXML HTTP Request to " & link
Debug.Print ie.Status; "XMLHTTP status "; ie.statusText; " at "; Time
getXMLPage = ie.responseText
Exit Function
recovery:
retryCount = retryCount + 1
Debug.Print "Error number: " & Err.Number _
        & " " & Err.Description & " Retry " & retryCount
        Application.StatusBar = "Error number: " & Err.Number _
        & " " & Err.Description & " Retry " & retryCount

If retryCount < 4 Then GoTo the_start Else Exit Function

End Function
选项显式
子加载rlSiteData()
Dim newHeaders()作为变量
newHeaders=数组(“类别”、“产品类别”、“产品主控产品id”、“产品页面名称”、“产品网络广播”、“产品url”)
GetInfo“帮助器示例”http://54.152.85.66:5000/get-产品信息”,新标题
newHeaders=数组(“类别”、“产品类别”、“产品主控产品id”、“产品页面名称”、“产品网络广播”、“产品url”)
GetInfo“图像样本”http://54.152.85.66:5000/query-缺少图像”,新标题
newHeaders=数组(“类别”、“问题”、“url”)
GetInfo“问题示例”http://54.152.85.66:5000/get-“问题”,新标题
端接头
公共子GetInfo(mySheet作为字符串,link作为字符串,myHeaders作为变量)
作为对象的Dim helperData
Dim headers(),项作为对象,结果(),键作为变量
将子项变暗为对象,r为长,c为长,cat为字符串
工作表(mySheet)。激活
Set helperData=WebHelpers.ParseJson(getXMLPage(link))
headers=myHeaders
重拨结果(1到100000,1到UBound(标题)+1)
r=1
Debug.Print“GetInfo解包JSON字典”
对于helperData中的每一项
多芬特
类别=项目(“类别”)
对于项目(“产品”)中的每个子项目
c=2
结果(r,1)=cat
对于子项中的每个键。键
结果(r,c)=子项(关键)
c=c+1
下一个
r=r+1
下一个
下一个
调试。打印“GetInfo将值加载到工作表”
单元格(1,1).Resize(1,UBound(标题)+1)=标题
单元格(2,1)。调整大小(UBound(results,1),UBound(results,2))=结果
调试。打印“GetInfo已完成”
端接头
函数getXMLPage(链接)作为字符串
关于错误转到恢复
Dim retryCount为整数
retryCount=0
尺寸ie为MSXML2.XMLHTTP60
设置ie=New MSXML2.XMLHTTP60
开始时:
即打开“获取”,链接,错误
ie.setRequestHeader“内容类型”、“应用程序/json”
送
而ie.readyState 4
多芬特
温德
调试。打印“”
调试。打印“MSXML HTTP请求到”&链接
调试。打印状态;“XMLHTTP状态”;即状态文本;“在”;时间
getXMLPage=ie.responseText
退出功能
恢复:
retryCount=retryCount+1
调试。打印“错误号:&错误号”_
&“”&Err.Description&“Retry”&retryCount
Application.StatusBar=“错误号:”&错误号_
&“”&Err.Description&“Retry”&retryCount
如果retryCount<4,则转到_start Else Exit函数
端函数
除了第三个URL(“get problems”),它有一个不同的模式,这个解决方案工作得很好,但似乎可以从模式中提取头,而不是硬编码,并且helperData循环中for Each item的变量也是如此。这将使解决方案更干净、更具普遍性。

我使用的是不同的解决方案,但这将分解字典和集合。如果将jsonconverter.bas中的代码安装到项目中,请转到VBE>工具>引用>添加对Microsoft脚本运行时的引用。您可以先从下面了解如何使用
End With

[]
是每个
循环的
集合,通过索引访问;
{}
是通过键访问的字典

您可以在此处看到一些结构:


VBA:

Option Explicit   
Public Sub GetInfo()
    Dim helperData As Object
    With CreateObject("MSXML2.XMLHTTP")
        .Open "GET", "http://54.152.85.66:5000/get-product-info", False
        .send
        Set helperData = jsonConverter.ParseJson(.responseText)
    End With
    Dim headers(), item As Object, results(), key As Variant
    Dim subItem As Object, r As Long, c As Long, cat As String
    headers = Array("category", "products_category", "products_master_prod_id", "products_page_name_dub", "products_product_webcat", "products_url")
    ReDim results(1 To 100000, 1 To UBound(headers) + 1)
    r = 1
    For Each item In helperData                        'col of dict
        cat = item("category")
        For Each subItem In item("products")
            c = 2
            results(r, 1) = cat
            For Each key In subItem.keys
                results(r, c) = subItem(key)
                c = c + 1
            Next
            r = r + 1
        Next
    Next
    ActiveSheet.Cells(1, 1).Resize(1, UBound(headers) + 1) = headers
    ActiveSheet.Cells(2, 1).Resize(UBound(results, 1), UBound(results, 2)) = results
End Sub

样本输出:


与您的相结合,我希望:

Option Explicit
Public Sub GetInfo()
    Dim helperData As Object
    Dim headers(), item As Object, results(), key As Variant
    Dim subItem As Object, r As Long, c As Long, cat As String
    Set helperData = WebHelpers.ParseJson(getXMLPage("http://54.152.85.66:5000/get-product-info"))
    headers = Array("category", "products_category", "products_master_prod_id", "products_page_name_dub", "products_product_webcat", "products_url")
    ReDim results(1 To 100000, 1 To UBound(headers) + 1)
    r = 1
    For Each item In helperData                  'col of dict
        cat = item("category")
        For Each subItem In item("products")
            c = 2
            results(r, 1) = cat
            For Each key In subItem.keys
                results(r, c) = subItem(key)
                c = c + 1
            Next
            r = r + 1
        Next
    Next
    ActiveSheet.Cells(1, 1).Resize(1, UBound(headers) + 1) = headers
    ActiveSheet.Cells(2, 1).Resize(UBound(results, 1), UBound(results, 2)) = results
End Sub

非常优雅的解决方案!我尝试将其推广到三个类似的URL请求。其中两个可以正常工作,但第三个()在这一行失败:对于item(“products”)中的每个子项。知道模式不同,我将“products”更改为“problems”,但在运行时错误424“Object required”时仍然失败。我编辑了我的问题,将您的答案与关于调整它的其他问题一起包括在内。目前,只有这两个。好的。我们将在今天晚些时候进行调查。