VBA: llamada de API que se muestra en Excel
cryptocurrency (2)
Eche un vistazo al siguiente ejemplo. Importe el módulo JSON.bas al proyecto VBA para el procesamiento 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
La salida para mí de la siguiente manera:
Por cierto, el enfoque similar se aplica en las siguientes respuestas: 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 y 12 .
Estoy tratando de mostrar los precios de criptomonedas específicas en una hoja de Excel. Extraigo los datos JSON de la API de CoinMarketCap: https://api.coinmarketcap.com/v1/ticker/
En última instancia, estoy tratando de obtener el precio de Ripple (línea 16), y luego establezco la celda B1 en mi hoja de Excel para mostrar el precio de Ripple (línea 17).
Este es mi guión, pero no funciona por alguna razón.
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
La llamada API es exitosa (creo), pero recibo errores de sintaxis, etc. Espero que alguien pueda ayudar. Gracias por adelantado
EDITAR: Esto es Microsoft Excel 2010
EDIT 2:
son las líneas 16 y 17 (respectivamente,
If oJSON.Name...
y
B1 = oJSON(...
eso plantea el problema, pero no he podido resolverlo / encontrar el error a partir de ahora. Ver comentarios para Error de tiempo de ejecución, etc.
EDITAR 3: Creo que he cometido un error en las líneas 16 y 17 al referirme a oJSON y no al elemento (sItem).
Sin embargo, incluso después de cambiar esto (por ejemplo,
If sItem.Name = "Ripple" Then...
), todavía no funciona.
EDIT 4: creo que también etiqueté la celda de Excel de manera incorrecta.
En lugar de simplemente escribir
B1 = ...
, ahora estoy escribiendo
Range.("B1").Value = ...
, que funcionó en una prueba.
Esta modificación sugerida por @omegastripes funciona aquí. El objeto json es una colección de diccionarios, por lo que debe tratarlo como tal.
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