JSON VBA Parse to Excel JSON VBA Parse to Excel json json

JSON VBA Parse to Excel


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

Option ExplicitSub 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 SubSub 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 WithEnd SubSub 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 WithEnd Sub

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

raw

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

flattened

BTW, the similar approach applied in other answers.