Importer en json dans excel Le sujet est résolu

Y compris Power BI, Power Query et toute autre question en lien avec Excel
s
stepaustras
Membre fidèle
Membre fidèle
Messages : 157
Inscrit le : 12 mai 2015
Version d'Excel : 2003

Message par stepaustras » 17 février 2017, 22:56

Sinon une dernière chose sur cette page de js

https://www.pmu.fr/services/turfInfo/cl ... 017/R5/C2/

il y a timezoneOffset: 3600000, et heureDepart: 1487267100000, le timezone offset je sais pas trop a quoi ça correspond et heure de départ ça doit donner 18h45 comment fait on pour transformer ça en quelque chose de lisible ?

Et aussi par exemple dans le fichier excel en pj, il y a un non partant mais ça m'écris des valeurs sur des colonnes ou il ne devrait rien y écrire.
Par exemple pour la cote en colonne T la cote il n'avait pas de cote et idem la colonne U ne devrais avoir une cellule vide ou la valeur faux.

J'ai mis un bouton ça exécute la macro

Je joins un fichier
test.xls
(33.5 Kio) Téléchargé 19 fois
s
stepaustras
Membre fidèle
Membre fidèle
Messages : 157
Inscrit le : 12 mai 2015
Version d'Excel : 2003

Message par stepaustras » 18 février 2017, 22:27

Je remet un autre fichier test pour les explications tous est dedans car je rame :lol: :lol: :mrgreen: :mrgreen:
test.xls
(122.5 Kio) Téléchargé 25 fois
Avatar du membre
pierrep56
Membre dévoué
Membre dévoué
Messages : 748
Appréciations reçues : 71
Inscrit le : 18 juin 2014
Version d'Excel : 2016

Message par pierrep56 » 19 février 2017, 10:58

Salut,

1/ Classiquement le timezoneOffset est le delta entre le temps universel et l'heure locale. Les valeurs genre 1487267100000 c'est un codage de l'heure (avec un facteur 1000)
Si tu fais le calcul en minutes soit : (heureDepart+timezoneOffset)/1000/24/60/60 le tout au format h:mm ça donne 18h45
Dans le code joint 1487162820000 donne bien 13h47

2/ J'y connais rien en bourrins, mais visiblement dans ton code tu mélanges les torchons et les serviettes, essaye et complète le code ci-après, ça donne 2 tableaux séparés avec 2 types d'info différentes.

A noter :
* les ClearContents qui effacent les données antérieures ...
* la fonction oRecordSet qui évite de répeter la même chose

Sub IdealDuGazeau()
Dim DataSet As Object, Elem As Object
Dim site As String, i As Long
Dim LaDate As String

    'If Sheets("Feuil1").Range("E4") Then
        LaDate = "15022017" 'Format(Range("E4"), "ddmmyyyy")
        
        site = "https://www.pmu.fr/services/turfInfo/client/1/programme/" & LaDate & "/R1/C5/participants"
        Set DataSet = oRecordSet(site)
        On Error Resume Next
        With Sheets("Data")
            .Range("A2:AA15").ClearContents
            i = 2
            For Each Elem In DataSet.participants
                .Cells(i, 1).Value = Elem.nom
                .Cells(i, 2).Value = Elem.numPmu
                .Cells(i, 3).Value = Elem.age
                .Cells(i, 4).Value = Elem.sexe
                .Cells(i, 5).Value = Elem.race
                .Cells(i, 6).Value = Elem.statut
                .Cells(i, 7).Value = Elem.placeCorde
                .Cells(i, 8).Value = Elem.oeilleres
                .Cells(i, 9).Value = Elem.proprietaire
                .Cells(i, 10).Value = Elem.entraineur
                .Cells(i, 11).Value = Elem.driver
                .Cells(i, 12).Value = Elem.tauxReclamation / 100
                .Cells(i, 13).Value = Elem.indicateurInedit
                .Cells(i, 14).Value = Elem.gainsParticipant.gainsCarriere / 100
                .Cells(i, 15).Value = Elem.handicapValeur
                .Cells(i, 16).Value = Elem.ordreDataSet
                .Cells(i, 17).Value = Elem.engagement
                .Cells(i, 18).Value = Elem.handicapPoids / 10
                .Cells(i, 19).Value = Elem.poidsConditionMonte / 10
                .Cells(i, 20).Value = Elem.dernierRapportDirect.rapport
                .Cells(i, 21).Value = Elem.dernierRapportReference.favoris
       
                i = i + 1
            Next Elem
        End With
        Set DataSet = Nothing
        
        site = "https://www.pmu.fr/services/turfInfo/client/1/programme/" & LaDate & "/R1/C1"
        Set DataSet = oRecordSet(site)
        With Sheets("Data")
            .Range("A20:AA50").ClearContents
            i = 20
            For Each Elem In DataSet.paris
                .Cells(i, 1).Value = DataSet.libelle
                .Cells(i, 2).Value = DataSet.numReunion
                .Cells(i, 3).Value = (DataSet.heureDepart + DataSet.timezoneOffset) / 1000 / 24 / 60 / 60
                .Cells(i, 4).Value = Elem.combine
                .Cells(i, 5).Value = Elem.codePari
                ' ... etc ...
            
                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

PS : juste une mise en garde :
Ce code utilise la fonction javascript A RISQUE Eval() : sur un site foireux ça peut importer des virus sur son ordi
cf : https://developer.mozilla.org/fr/docs/W ... obaux/eval
s
stepaustras
Membre fidèle
Membre fidèle
Messages : 157
Inscrit le : 12 mai 2015
Version d'Excel : 2003

Message par stepaustras » 19 février 2017, 13:55

Ok merci bcp je vais essayer de compléter mon fichier et voir ce que ça donne
s
stepaustras
Membre fidèle
Membre fidèle
Messages : 157
Inscrit le : 12 mai 2015
Version d'Excel : 2003

Message par stepaustras » 19 février 2017, 17:56

Voilà j'ai un peu complété tout est dans le module 2 mais j'ai deux petit truc a régler voir le fichier joint pour les explications.
J'ai désactivé l'effacement des cellules pour le moment. J'efface manuellement.
J'ai réussi a trouver la formule pour calculer la date alors je sais pas si c'est bon :mrgreen: 25570 qui correspond au 01/01/1970 + 1 (gmt) ce qui doit correspondre au 15/02/2017.
.Cells(i, 1).Value = (DataSet.dateReunion / 86400000) + 25570
test.xls
(139 Kio) Téléchargé 46 fois
Avatar du membre
pierrep56
Membre dévoué
Membre dévoué
Messages : 748
Appréciations reçues : 71
Inscrit le : 18 juin 2014
Version d'Excel : 2016

Message par pierrep56 » 19 février 2017, 20:30

Bah, c'est facile :

* la date tu l'a déjà dans ta requête en E4 : Format(Sheets("Feuil1")Range("E4"), "dd/mm/yyyy"), inutile d'aller la relire sur un json. En plus cette date est sûre puisqu'elle constitue l'adresse même du json. (Nb en passant : évite les select inutiles ...)

* ensuite tes colonnes W à AJ c'est constant pour tous les canassons de la même course, alors il suffit :
-- de lire ton "https://www.pmu.fr/services/turfInfo/cl ... programme/" & LaDate & "/R1/C5" en premier,
-- de placer les éléments dans une variable tableau quelconque
-- et enfin de recracher ces données lors de la lecture/écriture (en 2ème temps) de "https://www.pmu.fr/services/turfInfo/cl ... programme/" & LaDate & "/R1/C5/participants"

c'est tout.
s
stepaustras
Membre fidèle
Membre fidèle
Messages : 157
Inscrit le : 12 mai 2015
Version d'Excel : 2003

Message par stepaustras » 20 février 2017, 17:29

Ok merci, j'ai essayé donc des variables tableaux (dynamique qui semblent le mieux pour mon histoire) mais déjà ça coince j'ai deux codes mais aucun ne fonctionnent.
Private Sub CommandButton1_Click()
Dim VarTableau() As String, i As Integer, col As Integer, ligne As Integer
ligne = 1
col = 0
i = 1
Do While Cells(1, i) <> ""
ReDim VarTableau(i)
For col = 1 To UBound(VarTableau)
VarTableau(col) = Cells(ligne, col).Value
Cells(lignes + 6, col + 10).Value = VarTableau(col)
Next col
Loop
End Sub
et lui
Private Sub CommandButton1_Click()
Dim VarTableau() As String, i As Integer, col As Integer, ligne As Integer
ligne = 1
col = 0
i = 1
Do While Cells(1, i) <> ""

i = i + 1
Loop
Do While Cells(ligne, i) <> ""

ReDim VarTableau(i)
For col = 1 To UBound(VarTableau)
VarTableau(col) = Cells(ligne, col).Value
Cells(lignes + 6, col + 10).Value = VarTableau(col)
Next col
ligne = ligne + 1
Loop
End Sub
Avatar du membre
pierrep56
Membre dévoué
Membre dévoué
Messages : 748
Appréciations reçues : 71
Inscrit le : 18 juin 2014
Version d'Excel : 2016

Message par pierrep56 » 20 février 2017, 19:37

Oulà!?!
Plus simplement ! (Faut tout faire soi-même ici!)
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("Feuil1").Range("E4") Then
        LaDate = Format(Sheets("Feuil1").Range("E4"), "ddmmyyyy")
        T(0) = Format(Sheets("Feuil1").Range("E4"), "dd/mm/yyyy")  ' la date dans T(0)
        On Error Resume Next
        
        site = "https://www.pmu.fr/services/turfInfo/client/1/programme/" & LaDate & "/R1/C5"
        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)   ' la date au format dd/mm/yyyy
                .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
s
stepaustras
Membre fidèle
Membre fidèle
Messages : 157
Inscrit le : 12 mai 2015
Version d'Excel : 2003

Message par stepaustras » 20 février 2017, 19:47

Merci bcp pierrep56 :D ça fait une journée que j'épluche des tutos pour trouver la solution :mrgreen:
s
stepaustras
Membre fidèle
Membre fidèle
Messages : 157
Inscrit le : 12 mai 2015
Version d'Excel : 2003

Message par stepaustras » 20 février 2017, 21:00

Par contre ce que je voudrais comprendre, c'est quoi la différence entre ça
Set DataSet = oRecordSet(site)
et ça
For Each Elem In DataSet.participants
?
J'ai bien compris que le fichier json, converti ressemble comme a des dossiers et des sous dossiers mais je pige pas le truc.
Répondre Sujet précédentSujet suivant
  • Sujets similaires
    Réponses
    Vues
    Dernier message