Не могу понять, как получить доступ к массиву внутри объекта при разборе данных в Excel VBA - PullRequest
0 голосов
/ 07 мая 2019

Я пытаюсь получить данные с веб-сайта 'https://api.iextrading.com/1.0/stock/aapl/financials' на листе Excel (первоначально из https://iextrading.com/developer/docs/#financials). Я смог получить данные из' https://api.iextrading.com/1.0/stock/aapl/chart/1y', используя мой кодЯ пытался изменить его для страницы финансовых данных, но застрял, потому что не могу понять, как получить доступ к массиву в объекте, мой массив в настоящее время возвращает длину 2, то есть «символ» и «финансы».

Вот мой код:

'write to ws
Dim ws As Worksheet
Set ws = Sheets("Ratios")

Dim ticker As String
ticker = ws.Range("P7").Value

Dim lastrow As Integer
lastrow = ws.Cells(Rows.Count, "A").End(xlUp).row

'clear range
ws.Range("A1:L" & lastrow).Clear

'array col headers
Dim myarray As Variant
myarray = Array("reportDate", "grossProfit", "costOfRevenue", "operatingRevenue", "totalRevenue", "operatingIncome", "netIncome", "researchAndDevelopment", "operatingExpense", "currentAssets", "totalAssets", "totalLiabilities", "currentCash", "currentDebt", "totalCash", "totalDebt", "shareholderEquity", "cashChange", "cashFlow", "operatingGainsLosses")

arrsize = UBound(myarray) - LBound(myarray) + 1

Dim rngTarget As Range
Set rngTarget = ws.Range(Cells(1, 1), Cells(1, arrsize))
rngTarget = myarray

'send web requests for API data
u = "https://api.iextrading.com/1.0/stock/aapl/financials"

Set MyRequest = CreateObject("WinHttp.WinHttpRequest.5.1")
MyRequest.Open "Get", u
MyRequest.Send

'parse Json
Dim json As Object
Set json = JsonConverter.ParseJson(MyRequest.ResponseText)

'get # of objects in Array
Dim arraylen As Integer
arraylen = json.Count

MsgBox (arraylen)

'loop through elements
Dim elements As Variant

Dim x, y, r As Integer

r = 2
y = 1 
x = 1

While x < arraylen + 1

    For Each element In myarray

        ws.Cells(r, y).Value = json(x)(element)

        y = y + 1

    Next element

    y = 1
    x = x + 1
    r = r + 1

Wend

End Sub

Я также получаю несоответствие типов относительно json (x) (элемент).

Что я могу добавить в свой код такчто я могу получить доступ к массиву внутри объекта 'financials'?

1 Ответ

1 голос
/ 07 мая 2019

Вам нужен двойной цикл.[] - коллекции, к которым обращается индекс, а {} - словари, к которым обращается ключ.Возвращаемый объект - это словарь, и вам нужен ключ financials для возврата коллекции словарей в пределах.

Option Explicit
Public Sub GetData()
    Dim json As Object, results(), item As Object, headers()
    Dim key As Variant, ws As Worksheet, r As Long, c As Long
    Set ws = ThisWorkbook.Worksheets("Sheet1")
    With CreateObject("MSXML2.XMLHTTP")
        .Open "GET", "https://api.iextrading.com/1.0/stock/aapl/financials", False
        .send
        Set json = JsonConverter.ParseJson(.responseText)("financials")
        ReDim results(1 To json.Count, 1 To json.item(1).Count)
        headers = json.item(1).keys
        For Each item In json
            r = r + 1: c = 1
            For Each key In item.keys
                results(r, c) = item(key)
                c = c + 1
            Next
        Next
    End With
    With ws
        .Cells(1, 1).Resize(1, UBound(headers) + 1) = headers
        .Cells(2, 1).Resize(UBound(results, 1), UBound(results, 2)) = results
    End With
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...