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

我想从JSON请求中显示以下variables; B,C,D,E,F,G和H分别为“时间”,“打开”,“高”,“低”,“closures”,“音量从”,“音量到”

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

所以,我想看看例如位于C2:C51中的“open”的值。

我写了下面这个macros:

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 

不幸的是,这个macros不起作用,因为debugging显示在下面一行中有一个错误:

 For Each Item In JSON("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}, 

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

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

你近在咫尺:

  1. 我怀疑你可能做了复制/粘贴JSONparsing器,而不是下载*.bas文件并导入它。 如果你复制了文件,然后将其粘贴到一个模块中,你会看到Attribute VB_Name = "JsonConverter"虽然在.bas文件中是合法的,但它不在模块中,因此编译错误:无效的内部过程。 “ * 错误信息。
  2. 您在定义包含的variables之前创buildstrURL 。 因此variables将是空白的
  3. 在编写结果时,列号是closures的,所以它将从列A而不是B开始。
  4. 你没有声明你的一些variables。
  5. 由于JSON是一个字典types的对象,所以关键字将区分大小写(除非您声明为否则)。 因此, DATAData是两个不同的关键。 你需要使用Data

这是你的代码与变化; 不要忘记导入.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 关于VBA对象浏览器代码属性的文章。 通常认为外部链接是不好的forms,因为它们可能会消失。 但是,我在这里找不到一个好的讨论。 如果我错过了,有人请评论,我会编辑这个。

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

 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 

这是我的输出:

产量