Importer json dans excel Le sujet est résolu

Y compris Power BI, Power Query et toute autre question en lien avec Excel
Avatar du membre
muratime
Membre fidèle
Membre fidèle
Messages : 279
Appréciations reçues : 2
Inscrit le : 16 janvier 2008
Version d'Excel : 2007 FR

Message par muratime » 4 mars 2018, 18:50

Bonjour Forum :wink:

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 :)
Avatar du membre
muratime
Membre fidèle
Membre fidèle
Messages : 279
Appréciations reçues : 2
Inscrit le : 16 janvier 2008
Version d'Excel : 2007 FR

Message par muratime » 5 mars 2018, 09:20

Je précise que ce site m'appartient, j'ai mis un petit message perso

http://simple.gagnant.place.free.fr
Avatar du membre
Steelson
Fanatique d'Excel
Fanatique d'Excel
Messages : 11'422
Appréciations reçues : 591
Inscrit le : 13 octobre 2014
Version d'Excel : 2013 FR

Message par Steelson » 5 mars 2018, 10:06

Bonjour,
json.xlsm
(53.69 Kio) Téléchargé 42 fois

O.o°• ♪♪♫ °º¤ø,¸¸,ø¤º°`°º¤ø,¸ O.o°• ♪♪♫ °º¤ø,¸¸,ø¤º°`°º¤ø,¸
PI = 3.14159 26535 89793 23846 26433 83279 50288 41971 69399 37510 58209 74944 59230 78164 06286 20899 86280

( ͡• ͜ʖ ͡• )
Avatar du membre
muratime
Membre fidèle
Membre fidèle
Messages : 279
Appréciations reçues : 2
Inscrit le : 16 janvier 2008
Version d'Excel : 2007 FR

Message par muratime » 5 mars 2018, 10:36

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.
test.xlsm
(9.3 Kio) Téléchargé 15 fois
Avatar du membre
pierrep56
Membre dévoué
Membre dévoué
Messages : 933
Appréciations reçues : 124
Inscrit le : 18 juin 2014
Version d'Excel : 2016

Message par pierrep56 » 5 mars 2018, 11:29

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
1 membre du forum aime ce message.
Avatar du membre
Steelson
Fanatique d'Excel
Fanatique d'Excel
Messages : 11'422
Appréciations reçues : 591
Inscrit le : 13 octobre 2014
Version d'Excel : 2013 FR

Message par Steelson » 5 mars 2018, 11:47

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

O.o°• ♪♪♫ °º¤ø,¸¸,ø¤º°`°º¤ø,¸ O.o°• ♪♪♫ °º¤ø,¸¸,ø¤º°`°º¤ø,¸
PI = 3.14159 26535 89793 23846 26433 83279 50288 41971 69399 37510 58209 74944 59230 78164 06286 20899 86280

( ͡• ͜ʖ ͡• )
Avatar du membre
muratime
Membre fidèle
Membre fidèle
Messages : 279
Appréciations reçues : 2
Inscrit le : 16 janvier 2008
Version d'Excel : 2007 FR

Message par muratime » 5 mars 2018, 11:52

Merci pierrep56 effectivement ça marche nickel comme ça ::D 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")
Avatar du membre
pierrep56
Membre dévoué
Membre dévoué
Messages : 933
Appréciations reçues : 124
Inscrit le : 18 juin 2014
Version d'Excel : 2016

Message par pierrep56 » 5 mars 2018, 12:00

@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.
Avatar du membre
muratime
Membre fidèle
Membre fidèle
Messages : 279
Appréciations reçues : 2
Inscrit le : 16 janvier 2008
Version d'Excel : 2007 FR

Message par muratime » 5 mars 2018, 12:14

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.
Avatar du membre
Steelson
Fanatique d'Excel
Fanatique d'Excel
Messages : 11'422
Appréciations reçues : 591
Inscrit le : 13 octobre 2014
Version d'Excel : 2013 FR

Message par Steelson » 5 mars 2018, 13:04

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

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

O.o°• ♪♪♫ °º¤ø,¸¸,ø¤º°`°º¤ø,¸ O.o°• ♪♪♫ °º¤ø,¸¸,ø¤º°`°º¤ø,¸
PI = 3.14159 26535 89793 23846 26433 83279 50288 41971 69399 37510 58209 74944 59230 78164 06286 20899 86280

( ͡• ͜ʖ ͡• )
Répondre Sujet précédentSujet suivant
  • Sujets similaires
    Réponses
    Vues
    Dernier message