JSON VBA Parse to Excel

后端 未结 1 1351
礼貌的吻别
礼貌的吻别 2020-12-10 09:05

I got some JSON parsing working. I use VBA to parse a JSON code from my webserver, write that to cell A1 at my Excel Worksheet. But I don\'t get this to convert into the oth

相关标签:
1条回答
  • 2020-12-10 09:41

    Take a look at the below example. Import JSON.bas module into the VBA project for JSON processing.

    Option Explicit
    
    Sub Test()
    
        Dim sJSONString As String
        Dim vJSON
        Dim sState As String
        Dim aData()
        Dim aHeader()
        Dim vResult
    
        ' Retrieve question #50068973 HTML content
        With CreateObject("MSXML2.XMLHTTP")
            .Open "GET", "https://stackoverflow.com/questions/50068973", False
            .send
            sJSONString = .responseText
        End With
        ' Extract JSON sample from the question
        sJSONString = "{" & Split(sJSONString, "<code>{", 2)(1)
        sJSONString = Split(sJSONString, "</code>", 2)(0)
        ' Parse JSON sample
        JSON.Parse sJSONString, vJSON, sState
        If sState = "Error" Then
            MsgBox "Invalid JSON"
            End
        End If
        ' Convert raw JSON to array and output to worksheet #1
        JSON.ToArray vJSON, aData, aHeader
        With Sheets(1)
            .Cells.Delete
            .Cells.WrapText = False
            OutputArray .Cells(1, 1), aHeader
            Output2DArray .Cells(2, 1), aData
            .Columns.AutoFit
        End With
        ' Flatten JSON
        JSON.Flatten vJSON, vResult
        ' Convert flattened JSON to array and output to worksheet #2
        JSON.ToArray vResult, aData, aHeader
        With Sheets(2)
            .Cells.Delete
            .Cells.WrapText = False
            OutputArray .Cells(1, 1), aHeader
            Output2DArray .Cells(2, 1), aData
            .Columns.AutoFit
        End With
        MsgBox "Completed"
    
    End Sub
    
    Sub OutputArray(oDstRng As Range, aCells As Variant)
    
        With oDstRng
            .Parent.Select
            With .Resize(1, UBound(aCells) - LBound(aCells) + 1)
                .NumberFormat = "@"
                .Value = aCells
            End With
        End With
    
    End Sub
    
    Sub Output2DArray(oDstRng As Range, aCells As Variant)
    
        With oDstRng
            .Parent.Select
            With .Resize( _
                    UBound(aCells, 1) - LBound(aCells, 1) + 1, _
                    UBound(aCells, 2) - LBound(aCells, 2) + 1)
                .NumberFormat = "@"
                .Value = aCells
            End With
        End With
    
    End Sub
    

    The output on the worksheet #1 for the raw sample you provided is as follows:

    And there is the flattened sample output on the worksheet #2:

    BTW, the similar approach applied in other answers.

    0 讨论(0)
提交回复
热议问题