Importer en 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
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 » 20 février 2017, 22:37

La fonction oRecordSet renvoie un 'objet' dans DataSet (Objet au sens de la POO mais n'ayant pas tout à fait le même sens que l'Objet au sens json)
Cet objet a un ou plusieurs éléments
Et chaque élément est composé de plusieurs membres.
Chaque membre est un couple 'clé+valeur'

Comme dans un parc automobile(objet), il y a plusieurs voitures(éléments) et chaque voiture a un moteur, un volant, ...(membres)
Chaque membre a une valeur : Volant=en cuir, ou peinture=métallisée, ...(couple clé+valeur)

Ici on parse un json, l'objet DataSet représente le contenu entier du fichier. Dans ce fichier il y a un ou plusieurs éléments, par exemple des participants. Et chaque participant a un nom, un numéro, un statut, ... avec chacun une valeur.

L'intérêt du format json est de proposer une structure bien plus riche que des colonnes excel, on peut y trouver par exemple des 'Objets'(avec éléments et membres) eux-même imbriqués dans des éléments.
D’où la complexité à décoder(parser) du json en VBA (en PHP c'est plus simple puisque le javascript/json y est implémenté en natif)

En l'espèce, tes fichiers json ont des structures différentes selon le type d'info contenues. On doit donc prévoir une 'lecture' spécifique pour chaque json puisqu'ils sont hiérarchisés différemment.
s
stepaustras
Membre fidèle
Membre fidèle
Messages : 192
Appréciations reçues : 2
Inscrit le : 12 mai 2015
Version d'Excel : 2007

Message par stepaustras » 20 février 2017, 22:45

Le plus dur c'est de mettre en pratique. Par exemple là, j'essai de choper le libelleCourt avec encore une racine de moins dans l'adresse
{
cached: false,
timezoneOffset: 3600000,
dateReunion: 1453071600000,
numOfficiel: 1,
numOfficielReunionPrecedente: null,
numOfficielReunionSuivante: 2,
numExterne: 1,
nature: "DIURNE",
 -hippodrome: {
code: "VIN",
libelleCourt: "VINCENNES",
libelleLong: "HIPPODROME DE PARIS-VINCENNES"
Avec ce code mais j'y suis pas encore :mrgreen:
site = "https://www.pmu.fr/services/turfInfo/client/1/programme/" & LaDate & "/R3/"
        Set DataSet = oRecordSet(site)
        With Sheets("Data")
            '.Range("AK2:AA15").ClearContents
            i = 2
            For Each Hippo In DataSet.hippodrome
        T(15) = DataSet.libelleCourt
        
        Next Hippo
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 » 21 février 2017, 08:58

Bah, c'est toujours la même chose
Sub Ourasi()
Dim DataSet As Object, Elem As Object
Dim site As String, i As Long, j As Long
Dim LaDate As String, T(14) As Variant

    If Sheets("Feuil1").Range("E4") Then
        LaDate = Format(Sheets("Feuil1").Range("E4"), "ddmmyyyy")
        T(0) = Format(Sheets("Feuil1").Range("E4"), "dd/mm/yyyy")
        On Error Resume Next
        
        site = "https://www.pmu.fr/services/turfInfo/client/1/programme/" & LaDate & "/R3/"
        Set DataSet = oRecordSet(site)
        With Sheets("Feuil2")
            .Range("A2:AA15").ClearContents
            i = 2
            For Each Elem In DataSet.courses
                .Cells(i, 1).Value = T(0)
                .Cells(i, 2).Value = DataSet.hippodrome.libelleCourt
                .Cells(i, 3).Value = Elem.libelle
                .Cells(i, 4).Value = Elem.conditionAge
                ' etc ...
        
                i = i + 1
            Next
        End With
        Set DataSet = Nothing
    End If
End Sub
s
stepaustras
Membre fidèle
Membre fidèle
Messages : 192
Appréciations reçues : 2
Inscrit le : 12 mai 2015
Version d'Excel : 2007

Message par stepaustras » 21 février 2017, 12:01

Ok merci pour tout
s
stepaustras
Membre fidèle
Membre fidèle
Messages : 192
Appréciations reçues : 2
Inscrit le : 12 mai 2015
Version d'Excel : 2007

Message par stepaustras » 21 février 2017, 23:14

Re Pierre

Une dernière chose, je suis confronté a un problème, ici dans le js, il y a le même nom ! Comment tu ferais pour avoir le Rapport, dividende, simple gagnant et ensuite il y a trois fois le même nom pour dividende placé.

https://www.pmu.fr/services/turfInfo/cl ... definitifs

Merci encore de prendre du temps pour moi :wink:
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 » 22 février 2017, 18:41

Dans ce cas tu as un niveau supplémentaire d'imbrication avec un array inclus dans un élément objet, il suffit donc de faire une boucle supplémentaire ('for each' dans le 'for each')
C'est dans ce cas qu'on peut visualiser la souplesse du json par rapport aux "simples" colonnes d'excel.
Sub MistralGagnant()
Dim DataSet As Object, Elem As Object, Elem1 As Object
Dim site As String, i As Long

    On Error Resume Next
    site = "https://www.pmu.fr/services/turfInfo/client/7/programme/18012016/R1/C1/rapports-definitifs"
    Set DataSet = oRecordSet(site)
    With Sheets("Feuil3")
        .Range("A2:AA15").ClearContents
        i = 2
        For Each Elem In DataSet
            .Cells(i, 1).Value = Elem.typePari
            .Cells(i, 2).Value = Elem.miseBase
            For Each Elem1 In Elem.rapports
                .Cells(i, 3).Value = Elem1.libelle
                .Cells(i, 4).Value = Elem1.dividende
                .Cells(i, 5).Value = Elem1.dividendePourUnEuro
                .Cells(i, 6).Value = Elem1.combinaison
                .Cells(i, 7).Value = Elem1.nombreGagnants
                .Cells(i, 8).Value = Elem1.dividendePourUneMiseDeBase
                .Cells(i, 9).Value = Elem1.dividendeUnite
                i = i + 1
            Next
            i = i + 1
        Next
    End With
    Set DataSet = Nothing

End Sub
s
stepaustras
Membre fidèle
Membre fidèle
Messages : 192
Appréciations reçues : 2
Inscrit le : 12 mai 2015
Version d'Excel : 2007

Message par stepaustras » 22 février 2017, 19:11

Ok merci bcp :D ça fonctionne
W
Williams63
Nouveau venu
Nouveau venu
Messages : 2
Inscrit le : 17 novembre 2017
Version d'Excel : 2010

Message par Williams63 » 17 novembre 2017, 10:00

Bonjour,

Je reprends la discussion car ayant les même lien sur le pmu, je suis tombé sur votre code et c'est exactement ce qu'il me faut.
Je précise que j'ai que quelques notions de vba, j'ai bien compris l’environnement objet dans le json comme expliqué plus haut, par contre je sèche complétement sur la fonction et je pense que mon problème vient de la. Lors de exécution pas à pas, après avoir exécuté cette ligne de code " Set ScriptControl = CreateObject("MSScriptControl.ScriptControl") " il revient dans la macro et du coup je pense que la page web n'a pas été chargée dans la dataset.
peut être qu'il me manque une référence dans Outils / Références ?

Merci de votre aide.
    Sub IdealDuGazeau()
    Dim DataSet As Object, Elem As Object
    Dim site As String, i As Long, j As Long
    Dim LaDate As String, T(14) As Variant      ' ici T()=variable tableau

        If Sheets("Data").Range("A1") Then      ' s'il y a quelque chose dans A1 on continue
            LaDate = Format(Sheets("Data").Range("A1"), "ddmmyyyy") ' la date dans LaDate dans format "16022017"
            T(0) = Format(Sheets("Data").Range("A1"), "dd/mm/yyyy") ' la date dans T(0) dans format "16/02/2017"
           On Error Resume Next
           
            site = "https://www.pmu.fr/services/turfInfo/client/1/programme/" & LaDate & "/R1/C5"   'on construit l'adresse web
            Set DataSet = oRecordSet(site)
            ' on stocke dans T()
            T(1) = DataSet.libelle
            T(2) = DataSet.numReunion
            T(3) = DataSet.montantPrix
            T(4) = DataSet.parcours
            T(5) = DataSet.distance
            T(6) = DataSet.corde
            T(7) = DataSet.discipline
            T(8) = DataSet.categorieParticularite
            T(9) = DataSet.nombreDeclaresPartants
            T(10) = DataSet.conditionAge
            T(11) = DataSet.conditionSexe
            T(12) = DataSet.numOrdre
            T(13) = DataSet.numCourseDedoublee
            T(14) = (DataSet.heureDepart + DataSet.timezoneOffset) / 1000 / 24 / 60 / 60
           
            site = "https://www.pmu.fr/services/turfInfo/client/1/programme/" & LaDate & "/R1/C5/participants"
            Set DataSet = oRecordSet(site)
            With Sheets("Data")
                .Range("A2:AA15").ClearContents
                i = 2
                For Each Elem In DataSet.participants
                    .Cells(i, 1).Value = T(0)
                    .Cells(i, 2).Value = Elem.nom
                    .Cells(i, 3).Value = Elem.numPmu
                    .Cells(i, 4).Value = Elem.age
                    .Cells(i, 5).Value = Elem.sexe
                    .Cells(i, 6).Value = Elem.race
                    .Cells(i, 7).Value = Elem.statut
                    .Cells(i, 8).Value = Elem.placeCorde
                    .Cells(i, 9).Value = Elem.oeilleres
                    .Cells(i, 10).Value = Elem.proprietaire
                    .Cells(i, 11).Value = Elem.entraineur
                    .Cells(i, 12).Value = Elem.driver
                    .Cells(i, 13).Value = Elem.tauxReclamation / 100
                    .Cells(i, 14).Value = Elem.indicateurInedit
                    .Cells(i, 15).Value = Elem.gainsParticipant.gainsCarriere / 100
                    .Cells(i, 16).Value = Elem.handicapValeur
                    .Cells(i, 17).Value = Elem.ordreArrivee
                    .Cells(i, 18).Value = Elem.engagement
                    .Cells(i, 19).Value = Elem.handicapPoids / 10
                    .Cells(i, 20).Value = Elem.poidsConditionMonte / 10
                    .Cells(i, 21).Value = Elem.dernierRapportDirect.rapport
                    .Cells(i, 22).Value = Elem.dernierRapportReference.favoris
                    For j = 1 To 14
                        .Cells(i, 22 + j).Value = T(j) '  on recrache T() dans les colonnes
                   Next j
           
                    i = i + 1
                Next Elem
            End With
            Set DataSet = Nothing
           
        End If
    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

W
Williams63
Nouveau venu
Nouveau venu
Messages : 2
Inscrit le : 17 novembre 2017
Version d'Excel : 2010

Message par Williams63 » 28 novembre 2017, 14:52

le probleme a été résolu en installant la version 2016 d'office
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 » 31 mai 2019, 11:31

calten a écrit :
30 mai 2019, 19:19
Bonjour,

Je suis inscrit depuis aujourd'hui et je me permet de vous contacté pour avoir une solution
J'ai lu et essayé d'adapté votre code pour des besoins personnels, mais cela ne fonctionne pas
C'est dans ce sujet là
https://forum.excel-pratique.com/viewtopic.php?f=2&t=89337&p=518596&hilit=turf#p518596

Je souhaiterais récupéré dans le fichier json à cette adresse :
https://offline.turfinfo.api.pmu.fr/rest/client/7/programme/29052019/R1/C1/citations?paris=SIMPLE_GAGNANT&specialisation=OFFLINE&groupe=true

les informations suivantes:
typePari "SIMPLE_GAGNANT"
dateProgramme 1559080800000
timezoneOffset 7200000
numeroReunion 1
numeroCourse 1
numPmu 1
nom "PARIGOTE"
statut "PARTANT"
enjeu 743903
ratio 1.85

J'ai essayé en changeant les noms mais cela ne fonctionne pas.
Je vous remercie encore si vous pouvez m'aider.
Cordialement
Pour répondre en "public" à Calten, le tout est une affaire de "clés" :
Sub Calten()
Dim DataSet As Object, Cita As Object, Elem As Object, lg As Integer

    With Sheets("Feuil1")
        Set DataSet = Rcdst_Jsn(.Range("A1").Value)
        Set Cita = VBA.CallByName(DataSet.listeCitations, "0", VbGet)
        .Range("A3").Value = Cita.typePari
        .Range("B3").Value = Cita.dateProgramme
        .Range("C3").Value = Cita.timezoneOffset
        .Range("D3").Value = Cita.numeroReunion
        .Range("E3").Value = Cita.numeroCourse
        lg = 6
        For Each Elem In Cita.participants
            .Range("A" & lg).Value = Elem.numPmu
            .Range("B" & lg).Value = Elem.nom
            .Range("C" & lg).Value = Elem.statut
            .Range("D" & lg).Value = VBA.CallByName(Elem.citations, "0", VbGet).enjeu
            .Range("E" & lg).Value = VBA.CallByName(Elem.citations, "0", VbGet).ratio
            lg = lg + 1
        Next Elem
    End With
    Set DataSet = Nothing
    Set Cita = Nothing
End Sub
Pierre
Turf_Calten.xlsm
(26.22 Kio) Téléchargé 13 fois
Répondre Sujet précédentSujet suivant
  • Sujets similaires
    Réponses
    Vues
    Dernier message