VBA анализирует JSON и цикл различных объектов - PullRequest
0 голосов
/ 08 февраля 2019

Я пытаюсь проанализировать данные JSON из API, написанного в ячейках листа 1 (B11: B15), в Excel, используя VBA: API в ячейке B11 = enter image description here enter image description here

Api одинаковы и меняют только ID

enter image description here

Вот код, который я использую:

Option Explicit
Public r As Long, c As Long
Sub readValues()
    Dim sJSONString As String
    Dim ws As Worksheet
    Dim a As Integer
    Dim ID As String
    Dim I As Integer

    For a = 11 To 15
    With CreateObject("MSXML2.XMLHTTP")
        .Open "GET", Foglio1.Cells(a, 2), False
        .send
        sJSONString = .responseText
        'MsgBox sJSONString
    End With

    Dim JSON As Object, item As Object

    ID = Foglio1.Cells(a, 1)

    Set JSON = JsonConverter.ParseJson(sJSONString)("data")(ID)("statistics")("all")

    r = 1: c = 1

    EmptyDict JSON

    Next a
End Sub

Public Sub EmptyDict(ByVal dict As Object)

    Dim key As Variant, item As Object

    Select Case TypeName(dict)
    Case "Collection"

    For Each item In dict
        c = c
        r = r + 1
        EmptyDict item
    Next

    Case "Dictionary"
        For Each key In dict
            If TypeName(dict(key)) = "Collection" Then
                EmptyDict (dict(key))
            Else
                With ThisWorkbook.Worksheets("foglio1")
                    .Cells(r + 9, c + 5) = (key)
                    .Cells(r + 10, c + 5) = dict(key)
                End With
                c = c + 1
            End If

        Next

    End Select
End Sub

код работает нормально, но не может зациклить 5 ID API;код записывает все 5 элементов в одной строке 11. Кроме того, я хотел бы написать объекты «все», «рейтинг» и «псевдоним» и «время последней битвы» в каждой строке.Может ли кто-нибудь помочь мне?Спасибо

1 Ответ

0 голосов
/ 09 февраля 2019

Каждый цикл, который вы переустанавливаете, r = 1: c = 1, так что вы можете перезаписывать.Инициализируйте r вне цикла, а затем проверьте, где его нужно увеличить.Возможно, только в рамках функции.

Вам необходимо обеспечить приращение переменной c, в то время как r остается постоянным, чтобы держать все в одной строке.

rating и all являются словарями, поэтому вы должны получить доступ к элементам в них по ключу.last_battle_time представляется ключом для словаря: 507350581 (id?)

Ниже приведено считывание вашего json из ячейки и просто показывает, как осуществляется доступ к значениям.Я не использую вашу функцию.Вместо этого я увеличил бы r во время цикла.

Option Explicit
Sub test()
    Dim json As Object
    Set json = JsonConverter.ParseJson([A1])("data")("507350581")

    Dim battle As String, nickname As String                      '<just for sake of ease using this datatype
    battle = json("last_battle_time")
    nickname = json("nickname")
    Dim rating As Object, all As Object
    Set rating = json("statistics")("rating")
    Set all = json("statistics")("all")
    Dim r As Long, c As Long
    r = 2: c = 1

    With ActiveSheet
        .Cells(r, 1).Resize(1, rating.Count) = rating.Items
        .Cells(r, 1 + rating.Count).Resize(1, all.Count) = all.Items
        .Cells(r, 1 + rating.Count + all.Count) = nickname
        .Cells(r, 2 + rating.Count + all.Count) = battle
    End With

    'rating.keys  '<= array of the keys
    'rating.items '<== array of the items
    'rating and all can be passed to your function.
    Stop
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...