从单个JSON请求中解析多个单元格和值

时间:2017-10-31 18:20:53

标签: json excel vba

我想从JSON请求中显示以下变量; " time"," open"," high"," low"," close"," volume from& #34;," volumeto"分别在以下列B,C,D,E,F,G和H中。

请求: https://min-api.cryptocompare.com/data/histoday?fsym=BTC&tsym=USD&limit=60&aggregate=3&e=CCCAGG

所以,我想看看" open"的值。位于C2:C51。

我写了以下宏:

Sub OHLCdata()                                                            
Dim strURL As String                                                      
Dim strJSON As String                                                     
Dim strCurrency As String                                                 
Dim strLength As Integer                                                  
Dim i As Integer                                  
Dim http As Object                                                     

strURL = "https://min-api.cryptocompare.com/data/histoday?fsym=" & strTicker & "&tsym=" & strCurrency & "&limit=" & strLength & "&aggregate=3&e=CCCAGG" 
strTicker = Range("A2")
strCurrency = Range("A3")                                           
strLength = Range("A4")                                                   
Set http = CreateObject("MSXML2.XMLHTTP")                           
http.Open "GET", strURL, False                                      
http.Send                                                             
strJSON = http.responsetext                                               
Set JSON = JsonConverter.ParseJson(strJSON)                                 
i = 2                                                                     

For Each Item In JSON("DATA")
Sheets(1).Cells(i, 1).Value = Item("time")
Sheets(1).Cells(i, 2).Value = Item("open")
Sheets(1).Cells(i, 3).Value = Item("high")
Sheets(1).Cells(i, 4).Value = Item("low")
Sheets(1).Cells(i, 5).Value = Item("close")
Sheets(1).Cells(i, 6).Value = Item("volumefrom")
Sheets(1).Cells(i, 7).Value = Item("volumeto")                              
i = i + 1                                                                
Next                                                                      
End Sub

不幸的是,宏没有工作,因为调试显示以下行中存在错误:

For Each Item In JSON("DATA")

但是,我需要参考(" Data")吧?

{"Response":"Success","Type":100,"Aggregated":true,**"Data"**:[{"time":1493769600,"close":1507.77,"high":1609.84,"low":1424.05,"open":1445.93,"volumefrom":338807.89999999997,"volumeto":523652428.9200001},

任何人都可以向我解释我做错了什么吗?提前谢谢,

2 个答案:

答案 0 :(得分:0)

您可以将JSON数据放入数组并输出,如下面的示例代码所示。 JSON.bas模块导入VBA项目以进行JSON处理。

Option Explicit

Sub OHLCdata()

    Dim sJSONString As String
    Dim vJSON As Variant
    Dim sState As String
    Dim aData()
    Dim aHeader()

    With CreateObject("MSXML2.XMLHTTP")
        .Open "GET", "https://min-api.cryptocompare.com/data/histoday?fsym=BTC&tsym=USD&limit=60&aggregate=3&e=CCCAGG", False
        .send
        sJSONString = .responseText
    End With
    JSON.Parse sJSONString, vJSON, sState
    vJSON = vJSON("Data")
    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

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

这是我的输出:

output

答案 1 :(得分:0)

任何人都可以向我解释我做错了吗?

你很近:

  1. 我怀疑你可能在JSON解析器上进行了复制/粘贴,而不是下载*.bas文件并导入它。如果您复制了文件然后将其粘贴到模块中,您会看到行Attribute VB_Name = "JsonConverter"虽然在.bas文件中是合法的,但它不在模块中,因此*"编译错误:程序内部无效。" *错误信息。
  2. 在定义包含的变量之前,先创建strURL。因此变量将为空白
  3. 撰写结果时,您的列号已关闭,因此它将从A列而不是B开始。
  4. 您未能声明某些变量。
  5. 由于JSON是字典类型对象,因此密钥区分大小写(除非您另行声明)。因此DATAData是两个不同的键。您需要使用Data
  6. 以下是包含更改的代码;并且不要忘记导入.bas文件,不要复制/粘贴。

    Option Explicit
    Sub OHLCdata()
    Dim strURL As String
    Dim strJSON As String
    Dim strCurrency As String
    Dim strLength As Integer
    Dim strTicker As String
    Dim i As Integer
    Dim http As Object
    
    Dim JSON As Dictionary, Item As Dictionary
    
    
    strTicker = Range("A2")
    strCurrency = Range("A3")
    strLength = Range("A4")
    
    strURL = "https://min-api.cryptocompare.com/data/histoday?fsym=" & strTicker & "&tsym=" & strCurrency & "&limit=" & strLength & "&aggregate=3&e=CCCAGG"
    
    Set http = CreateObject("MSXML2.XMLHTTP")
    http.Open "GET", strURL, False
    http.Send
    strJSON = http.responsetext
    Set JSON = JsonConverter.ParseJson(strJSON)
    i = 2
    
    For Each Item In JSON("Data")
    Sheets(1).Cells(i, 2).Value = Item("time")
    Sheets(1).Cells(i, 3).Value = Item("open")
    Sheets(1).Cells(i, 4).Value = Item("high")
    Sheets(1).Cells(i, 5).Value = Item("low")
    Sheets(1).Cells(i, 6).Value = Item("close")
    Sheets(1).Cells(i, 7).Value = Item("volumefrom")
    Sheets(1).Cells(i, 8).Value = Item("volumeto")
    i = i + 1
    Next
    End Sub
    

    注意:关于在bas文件中可见的Attribute行,如果您在文本编辑器中打开它,可以参考Chip Pearson关于{{{I}的文章。 3}}。引用外部链接通常被认为是不好的形式,因为它们可能会消失。但是,我在这里找不到一个很好的讨论。如果我错过了,请有人发表评论,我会对此进行编辑。