with - read json file using vba




Analyser plusieurs cellules et valeurs à partir d'une seule demande JSON (2)

Je voudrais afficher les variables suivantes d'une requête JSON; "time", "open", "high", "low", "close", "volumefrom", "volumeto" dans les colonnes suivantes respectivement B, C, D, E, F, V et H.

La demande: https://min-api.cryptocompare.com/data/histoday?fsym=BTC&tsym=USD&limit=60&aggregate=3&e=CCCAGG

Donc, j'aimerais par exemple voir les valeurs de "open" situées dans C2: C51.

J'ai écrit la macro suivante:

Sub OHLCdata()                                                            
Dim strURL As String                                                      
Dim strJSON As String                                                     
Dim strCurrency As String                                                 
Dim strLength As Integer                                                  
Dim i As Integer                                  
Dim http As Object                                                     

strURL = "https://min-api.cryptocompare.com/data/histoday?fsym=" & strTicker & "&tsym=" & strCurrency & "&limit=" & strLength & "&aggregate=3&e=CCCAGG" 
strTicker = Range("A2")
strCurrency = Range("A3")                                           
strLength = Range("A4")                                                   
Set http = CreateObject("MSXML2.XMLHTTP")                           
http.Open "GET", strURL, False                                      
http.Send                                                             
strJSON = http.responsetext                                               
Set JSON = JsonConverter.ParseJson(strJSON)                                 
i = 2                                                                     

For Each Item In JSON("DATA")
Sheets(1).Cells(i, 1).Value = Item("time")
Sheets(1).Cells(i, 2).Value = Item("open")
Sheets(1).Cells(i, 3).Value = Item("high")
Sheets(1).Cells(i, 4).Value = Item("low")
Sheets(1).Cells(i, 5).Value = Item("close")
Sheets(1).Cells(i, 6).Value = Item("volumefrom")
Sheets(1).Cells(i, 7).Value = Item("volumeto")                              
i = i + 1                                                                
Next                                                                      
End Sub

Malheureusement, la macro ne fonctionne pas car le débogage montre qu'il y a une erreur dans la ligne suivante:

For Each Item In JSON("DATA")

Cependant, je dois me référer à ("données"), non?

{"Response":"Success","Type":100,"Aggregated":true,**"Data"**:[{"time":1493769600,"close":1507.77,"high":1609.84,"low":1424.05,"open":1445.93,"volumefrom":338807.89999999997,"volumeto":523652428.9200001},

Quelqu'un peut-il m'expliquer ce que je fais mal? Merci d'avance,


Vous pouvez obtenir des données JSON dans des tableaux et les afficher comme indiqué dans l'exemple de code ci-dessous. Importez le module JSON.bas dans le projet VBA pour le traitement JSON.

Option Explicit

Sub OHLCdata()

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

    With CreateObject("MSXML2.XMLHTTP")
        .Open "GET", "https://min-api.cryptocompare.com/data/histoday?fsym=BTC&tsym=USD&limit=60&aggregate=3&e=CCCAGG", False
        .send
        sJSONString = .responseText
    End With
    JSON.Parse sJSONString, vJSON, sState
    vJSON = vJSON("Data")
    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

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

Voici la sortie pour moi:


Quelqu'un peut-il m'expliquer ce que je fais mal?

Tu es proche:

  1. Je suppose que vous avez probablement fait un copier / coller sur l’analyseur JSON au lieu de télécharger le fichier *.bas et de l’importer. Si vous copiez le fichier puis le collez dans un module, vous verrez la ligne Attribute VB_Name = "JsonConverter" Bien que le fichier .bas soit légal, il ne figure pas dans un module, d'où l'erreur de compilation *: invalide dans la procédure. " * Message d'erreur.
  2. Vous créez strURL avant de définir les variables à inclure. Par conséquent, les variables seront vides
  3. Les numéros de colonne sont désactivés lorsque vous écrivez les résultats. La colonne A commence au lieu de B.
  4. Vous ne parvenez pas à déclarer certaines de vos variables.
  5. Comme JSON est un objet de type dictionnaire, la clé sera sensible à la casse (sauf si vous le déclarez autrement). Par conséquent, DATA et Data sont deux clés différentes. Vous devez utiliser Data .

Voici votre code avec les modifications; et n'oubliez pas d'importer le fichier .bas et de ne pas copier / coller.

Option Explicit
Sub OHLCdata()
Dim strURL As String
Dim strJSON As String
Dim strCurrency As String
Dim strLength As Integer
Dim strTicker As String
Dim i As Integer
Dim http As Object

Dim JSON As Dictionary, Item As Dictionary


strTicker = Range("A2")
strCurrency = Range("A3")
strLength = Range("A4")

strURL = "https://min-api.cryptocompare.com/data/histoday?fsym=" & strTicker & "&tsym=" & strCurrency & "&limit=" & strLength & "&aggregate=3&e=CCCAGG"

Set http = CreateObject("MSXML2.XMLHTTP")
http.Open "GET", strURL, False
http.Send
strJSON = http.responsetext
Set JSON = JsonConverter.ParseJson(strJSON)
i = 2

For Each Item In JSON("Data")
Sheets(1).Cells(i, 2).Value = Item("time")
Sheets(1).Cells(i, 3).Value = Item("open")
Sheets(1).Cells(i, 4).Value = Item("high")
Sheets(1).Cells(i, 5).Value = Item("low")
Sheets(1).Cells(i, 6).Value = Item("close")
Sheets(1).Cells(i, 7).Value = Item("volumefrom")
Sheets(1).Cells(i, 8).Value = Item("volumeto")
i = i + 1
Next
End Sub

Remarque : en ce qui concerne la ligne d' Attribute visible dans le fichier bas si vous l'ouvrez dans un éditeur de texte, vous pouvez vous reporter à l'article de Chip Pearson sur les attributs de code pour le navigateur d'objets VBA . Il est généralement considéré comme une mauvaise forme de faire référence à un lien externe, car ils peuvent disparaître. Cependant, je ne pouvais pas trouver une bonne discussion ici sur SO. Si je l’ai manquée, veuillez commenter et je vais l’éditer.





vba