VBA - вызов API отображается в Excel

Я пытаюсь показать цены конкретных криптовалют в листе Excel. Я извлекаю данные JSON из API CoinMarketCap - https://api.coinmarketcap.com/v1/ticker/

В конечном итоге я пытаюсь получить цену Ripple (строка 16), а затем установить ячейку B1 в своем листе Excel, чтобы отобразить цену Ripple (строка 17).

Это мой сценарий, но по какой-то причине он не работает.

Sub test()

Dim httpObject As Object
Set httpObject = CreateObject("MSXML2.XMLHTTP")

sURL = "https://api.coinmarketcap.com/v1/ticker/"

sRequest = sURL
httpObject.Open "GET", sRequest, False
httpObject.Send
sGetResult = httpObject.ResponseText

Dim oJSON As Object
Set oJSON = JsonConverter.ParseJson(sGetResult)

  If oJSON.Name = "Ripple" Then
  B1 = oJSON("Ripple")("price_usd")

End If
End Sub

Вызов API успешен (я верю), но я получаю синтаксические ошибки и т. Д. Надеюсь, кто-нибудь сможет помочь. заранее спасибо

РЕДАКТИРОВАТЬ: это Microsoft Excel 2010

РЕДАКТИРОВАТЬ 2: это строки 16 и 17 (соответственно If oJSON.Name... а также B1 = oJSON(... это создает проблему, но я не смог ее решить / найти ошибку на данный момент. Смотрите комментарии для Run Time Error и т. Д.

РЕДАКТИРОВАТЬ 3: Я считаю, что я сделал ошибку в строках 16 и 17, ссылаясь на oJSON, а не на элемент (sItem). Тем не менее, даже после изменения этого (например, If sItem.Name = "Ripple" Then...), это все еще не работает.

РЕДАКТИРОВАТЬ 4: Я считаю, что я также пометил Excel-ячейку неправильно. Вместо того, чтобы просто писать B1 = ...Я сейчас пишу Range.("B1").Value = ..., который работал в тесте.

2 ответа

Решение

Эта модификация, предложенная @omegastripes, работает здесь. Объект json представляет собой набор словарей, поэтому вам нужно обращаться с ним как с таковым.

Dim oJSON As Object
Set oJSON = JsonConverter.ParseJson(sGetResult)

Dim V As Object
For Each V In oJSON
    If V("name") = "Ripple" Then
        Cells(1, 2) = V("price_usd")
        Exit For
    End If
Next V

Посмотрите на приведенный ниже пример. Импортируйте модуль JSON.bas в проект VBA для обработки JSON.

Option Explicit

Sub Test48852376()

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

    ' Retrieve JSON string
    With CreateObject("MSXML2.XMLHTTP")
        .Open "GET", "https://api.coinmarketcap.com/v1/ticker/", False
        .Send
        sJSONString = .responseText
    End With
    ' Parse JSON
    JSON.Parse sJSONString, vJSON, sState
    If sState = "Error" Then MsgBox "Invalid JSON string": Exit Sub
    ' Extract ripple price_usd
    Do
        For Each vElement In vJSON
            Select Case False
                Case vElement.Exists("id")
                Case vElement("id") = "ripple"
                Case vElement.Exists("price_usd")
                Case Else
                    MsgBox "ripple price_usd " & vElement("price_usd")
                    Exit Do
            End Select
        Next
        MsgBox "ripple price_usd not found"
    Loop Until True
    ' Output the entire table to the worksheet
    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
    MsgBox "Completed"

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

Вывод для меня следующий:

выход

Кстати, аналогичный подход применяется в следующих ответах: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 и 12.

Другие вопросы по тегам