VBA-JSON嵌套集合解析成Excel

kqlmhetl  于 2023-04-22  发布在  其他
关注(0)|答案(1)|浏览(164)

我使用的VBA-JSON模块从下面的链接,从那里的天气信息被捕获的来源已经从一个列表结构的7天的数据被每小时列出,变成一个数组的一天,每一天有另一个arrary的小时。
这是我作为Marco. https://github.com/VBA-tools/VBA-JSON导入VBA的模块
forecastday和hour是一个集合对象,当使用这个VBA-JSON库转换时,我不熟悉VBA....我应该如何纠正for循环中的两行,以使数据显示为附加的图像?(这是在http源代码更改之前系统的工作方式)

http://api.weatherapi.com/v1/forecast.json?key=4c6f7219367f4aa5b0c174927231104&q=51.180224,-113.9385224&days=7&aqi=no&alerts=no

Public Sub exceljson()

Dim http As Object, JSON As Object, i As Integer

Set http = CreateObject("MSXML2.XMLHTTP")

http.Open "GET", "http://api.weatherapi.com/v1/forecast.json?key=4c6f7219367f4aa5b0c174927231104&q=51.180224,-113.9385224&days=7&aqi=no&alerts=no", False
http.Send

Set JSON = JsonConverter.ParseJson(http.responseText)

For i = 4 To 169

Sheets("Setup").Cells(i, 1).Value = JSON("forecast")("forecastday")("hour")(i)("time_epoch")
Sheets("Setup").Cells(i, 2).Value = JSON("forecast")("forecastday")("hour")(i)("temp_c")

Next

End Sub


(预期excel结果)
循环中的以下两行是执行时生成错误的地方。

For i = 4 To 169

Sheets("Setup").Cells(i, 1).Value = JSON("forecast")("forecastday")("hour")(i)("time_epoch")
Sheets("Setup").Cells(i, 2).Value = JSON("forecast")("forecastday")("hour")(i)("temp_c")

Next.

但是我不确定如何处理嵌套的集合对象。是否应该有一个(j)和(i)?j表示一周中的天数〈8?我读到VBA的JSON转换器将任何[]值转换为VBA集合对象。
无论我尝试了什么,都给予了运行时错误5或13。
这应该是预期的格式吗?但在调试时不接受。我认为forecastday应该在一周内循环7次,然后每天都应该有一个小时循环,一天中的24小时?不知道如何在VBA中实现这一点。

JSON("forecast")("forecastday")(j)("hour")(i)("temp_c")

请帮助,我怎么能做到这一点?我已经附加了一个名为“(预期的Excel结果)”的图像中的预期结果为一个名为“设置”的选项卡有一个列A开始在第4行记录的时间戳条目,列B是预测的温度为那一天,预测每小时。

dwbf0jvd

dwbf0jvd1#

由于forecastday实际上是一个集合而不是字典,所以需要循环7天,然后是24小时。因此,考虑一个带有行和列迭代器的嵌套循环。下面返回hour的 * 所有 * 元素,除了嵌套的condition

Public Sub exceljson()
On Error GoTo ErrHandle
    Dim http As Object, JSON As Object
    Dim currHour As Dictionary
    Dim k As Variant
    Dim i As Long, j As Long, row As Long, col As Long

    Set http = CreateObject("MSXML2.XMLHTTP")
    
    http.Open "GET", "http://api.weatherapi.com/v1/forecast.json?key=4c6f7219367f4aa5b0c174927231104&q=51.180224,-113.9385224&days=7&aqi=no&alerts=no", False
    http.Send
    
    Set JSON = JsonConverter.ParseJson(http.responseText)

    row = 2
    For i = 1 To JSON("forecast")("forecastday").Count
        For j = 1 To JSON("forecast")("forecastday")(i)("hour").Count
            Set currHour = JSON("forecast")("forecastday")(i)("hour")(j)
            col = 1
            For Each k In currHour.Keys
                If row = 2 Then
                    Sheets("Setup").Cells(1, col) = k               ' HEADER
                End If
                If k <> "condition" Then
                    Sheets("Setup").Cells(row, col) = currHour(k)   ' DATA
                    col = col + 1
                End If
            Next k
            row = row + 1
        Next j
    Next i
    
ExitHandle:
    Set currHour = Nothing: Set JSON = Nothing: Set http = Nothing
    Exit Sub

ErrHandle:
    MsgBox Err.Number & ": " & Err.Description, vbCritical, "RUNTIME ERROR"
    Resume ExitHandle
End Sub

输出

相关问题