Importer json dans Excel

Bonjour Forum

Voilà j'essai d'importer du json dans mon fichier excel mais ça ne fonctionne pas.

La page test est ici http://simple.gagnant.place.free.fr/essai.js

Et voici le code que j'ai pour le moment

Sub Essai()
Dim DataSet As Object, Elem As Object
Dim site As String, i As Long, j As Long
Dim k As Variant

Application.ScreenUpdating = False

     site = "http://simple.gagnant.place.free.fr/essai.js"
        Set DataSet = oRecordSet(site)
        With Sheets("Feuil1")
            .Range("A2:J21").ClearContents
            i = 2
            For Each Elem In DataSet.data.k

                .Cells(i, 1).Value = Elem.Time
                .Cells(i, 2).Value = Elem.hometeam

                 i = i + 1
            Next Elem
        End With

        Set DataSet = Nothing

    Application.ScreenUpdating = True

End Sub

Function oRecordSet(site As String) As Object
Dim ScriptControl As Object, Html As Object, Obj As Object

    Set ScriptControl = CreateObject("MSScriptControl.ScriptControl")
    ScriptControl.Language = "JScript"

    Set Html = CreateObject("MSXML2.XMLHTTP")
    With Html
        .Open "GET", site, False
        .send
        Set Obj = ScriptControl.Eval("(" & .responsetext & ")")
    End With
    Set oRecordSet = Obj
    Set Obj = Nothing
End Function

Alors évidement dans le js j'aimerais garder le time: "2018-03-11 11:30:00" , l'avoir en A1 et l'heure en B1

et le reste C1, D1 etc Le hometeam, le awayteam, le country, le first 1x2

Voilà vôtre aide sera la bienvenue

Bonjour,

76json.xlsm (53.69 Ko)

Merci Steelson, par contre niveau du code ça se complique plus que j'avais prévu.

Je met fichier car le but ça serais de ranger comme dans le fichier tous le reste j'en est pas besoin, pour ça avec le bout de code que j'avais mis pensais qu'il y avait juste une ou deux modif a faire pour que ça fonctionne.

J'ai juste mis les deux premier match comme exemple.

23test.xlsm (9.30 Ko)

Bonjour à tous,

Du fait de la structure de ce json (utilisation des mots clé 'data', 'time' dans les étiquettes), voici une autre manière de faire :

Sub Bourne()
Dim DataSet As Object, Elem As Object
Dim Site As String, i As Long
Dim T As Variant, Res As Variant

    T = Array("2429552-0", "2450542-0", "2443065-0", "2422601-0", "2444491-0", _
              "2439937-0", "2450727-0", "2428131-0", "2449919-0", "2443064-0", _
              "2443706-0", "2422660-0", "2443433-0", "2438810-0", "2424301-0", _
              "2431645-0", "2423094-0", "2436787-0", "2443067-0", "2444492-0", _
              "2438807-0", "2429844-0", "2439935-0", "2442331-0", "2447714-0", _
              "2438661-0", "2424266-0", "2431644-0", "2448992-0", "2434763-0")
    ReDim Res(8, 0)

    Site = "http://simple.gagnant.place.free.fr/essai.js"
    Set DataSet = VBA.CallByName(oRecordSet(Site), "data", VbGet)

    For i = 0 To UBound(T)
        ReDim Preserve Res(8, i)
        Set Elem = VBA.CallByName(DataSet, T(i), VbGet)
        Res(0, i) = T(i)
        Res(1, i) = Split(VBA.CallByName(Elem, "time", VbGet))(0)
        Res(2, i) = Split(VBA.CallByName(Elem, "time", VbGet))(1)
        Res(3, i) = Elem.hometeam
        Res(4, i) = Elem.awayteam
        Res(5, i) = Elem.country
        Res(6, i) = VBA.CallByName(Elem.first, "1", VbGet)
        Res(7, i) = VBA.CallByName(Elem.first, "X", VbGet)
        Res(8, i) = VBA.CallByName(Elem.first, "2", VbGet)
    Next i

    T = Array("Code", "Date", "Heure", "hometeam", "awayteam", "country", "_1_", "X", "_2_")
    Sheets("Feuil1").Range("A1").Resize(1, UBound(T, 1) + 1) = T
    Res = Application.Transpose(Res)
    Sheets("Feuil1").Range("A2").Resize(UBound(Res, 1), UBound(Res, 2)) = Res

    Set Elem = Nothing
    Set DataSet = Nothing
End Sub

Function oRecordSet(Ttk As String) As Object
Dim ScriptControl As Object, Html As Object, Obj As Object, S As String

    Set ScriptControl = CreateObject("MSScriptControl.ScriptControl")
    ScriptControl.Language = "JScript"

    Set Html = CreateObject("MSXML2.XMLHTTP")
    With Html
        .Open "GET", Ttk, False
        .send
        S = .responsetext
    End With

    Set Obj = ScriptControl.Eval("(" & S & ")")
    Set oRecordSet = Obj
    Set Obj = Nothing
End Function

Merci Pierre, j'attendais ta réponse (tu es plus fort que moi sur les json)

Pourquoi oRecordSet ?

Merci pierrep56 effectivement ça marche nickel comme ça par contre ces chiffres dont j'ai pas besoin pas moyen de les supprimer dans le code par une valeur unique ? Leur valeur ne seront jamais les mêmes.

T = Array("2429552-0", "2450542-0", "2443065-0", "2422601-0", "2444491-0", _
              "2439937-0", "2450727-0", "2428131-0", "2449919-0", "2443064-0", _
              "2443706-0", "2422660-0", "2443433-0", "2438810-0", "2424301-0", _
              "2431645-0", "2423094-0", "2436787-0", "2443067-0", "2444492-0", _
              "2438807-0", "2429844-0", "2439935-0", "2442331-0", "2447714-0", _
              "2438661-0", "2424266-0", "2431644-0", "2448992-0", "2434763-0")

@Steelson : ta solution n'est pas mal non plus!

'oRecordSet' => une vieille habitude : préfixe 'o' pour désigner un objet (object), 'RecordSet' pour désigner un jeu de données quelconque

@muratime : c'est la faiblesse de mon code par rapport à celui de Steelson (qui est bien plus générique). Avec un autre jeu de donnée, il faudrait voir si ces codes sont identiques ou non, et si non voir comment ils sont générés par leur système pour les 'imiter'... ou utiliser le 'code #Steelson' pour récupérer ces codes à la volée.

Ces codes changeront tous le temps, jamais le même chiffre, c'est vrai qu'avec le code de Steelson, ya plus qu' faire le ménage pour y placer tous au bon endroit.

j'avoue, ce n'est pas "que" de moi

@muratime : en effet, puise ce dont tu as ensuite besoin par des recherches

Ok les gars, alors je propose la manip suivante :

* dans le texte brut du json, on repère toutes les occurrences des codes du type '2429552-0' avec la regex pattern "\d{7}-\d", et on les ajoute à un tableau (en cochant bien sûr la réf MS Regular Expression 5.5).

* ensuite, on boucle comme avant sur ces valeurs pour décoder le json

De cette façon si les codes ont toujours le même pattern, c'est dynamique et ça fonctionne.

12json-bourne.xlsm (28.09 Ko)

Merci pierrep56 Comme ça c'est nickel, ça marche bien juste ça me manque une ligne il y a le first et il me faudrait le last

Ben c'est simple

8json-bourne.xlsm (28.06 Ko)

Ah oui comme ça c'est simple, je cherchais à les mettre par ligne c'est a dire sur deux lignes pour un match avec le first et le last.

regex pattern "\d{7}-\d",

Excelletissime ...

Nickel chrome merci encore me manquerais juste le profit avec le % qui fais c.. mais bon.

Le principe est toujours le même, quand une étiquette est un mot clé ou contient un signe particulier (comme '%'), il faut passer par un 'CallByName'

26json-bourne.xlsm (28.37 Ko)

Ok bon bah merci beaucoup pierrep56 et Steelson pour vôtre aide c'est génial.

J'ai mis sujet résolu mais je doute que ça fonctionne !!! Ou alors je suis une quiche

Rechercher des sujets similaires à "importer json"