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.