Importer en json dans Excel

Bonjour à toutes et a tous,

Voilà j'aimerais importer des données depuis un fichier .js (jason) dans excel.

J'ai fait un fichier test en js a cette adresse

http://simple.gagnant.place.free.fr/test.js

et j'aimerais avoir le résultat comme dans le fichier exemple en PJ, qui a été fait a partir d'une page internet qui converti le js en csv mais j'aimerais le faire directement depuis excel sans passer par ce convertisseur.

Merci de vôtre aide

697test.zip (8.45 Ko)

Bonjour,

Menu Données -> A partir du web et mettre ton lien

Merci,

Le problème avec cette méthode c'est que un fichier json tu te retrouve avec tous dans la cellule A1 et ça donne pas du tout le même résultat que mon fichier exemple. Il faut convertir je ne sais comment, j'avais lu a un endroit peu être il faut ajouter un module de classe qu'on peu trouver sur le net "jsconverter.bas" et activer la ref microsoft script runtime mais j'ai jamais su comment faire.

D'ailleurs je vais mettre ce lien pour le json car mon exemple test c'est pas bon

et sur ce lien c'est ce que je me suis servi pour convertir mon js en collant le lien ci dessus.

https://json-csv.com/

J'avais vu un tuto avec Office 2016 mais moi j'ai que excel 2003

Re,

Alors bonne chance

personnellement je n'aime pas travailler sur des projets ou il s'agit de pari que ce soit PMU ou autre

Bonjour à tous,

Essaye ce code pour voir :

Sub Turf()
Dim ScriptControl As Object, PMU As Object
Dim Ecurie As Object, Cheval As Object
Dim Site As String, i As Long

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

    Site = "https://www.pmu.fr/services/turfInfo/client/1/programme/18012016/R1/C1/participants"
    With CreateObject("MSXML2.XMLHTTP")
        .Open "GET", Site, False
        .send
        Set PMU = ScriptControl.Eval("(" + .responseText + ")")
        .abort
    End With

    i = 2
    Set Ecurie = PMU.participants
    For Each Cheval In Ecurie
        With ActiveSheet
            .Cells(i, 1).Value = Cheval.nom
            .Cells(i, 2).Value = Cheval.numPmu
            .Cells(i, 3).Value = Cheval.age
            .Cells(i, 4).Value = Cheval.sexe
            .Cells(i, 5).Value = Cheval.race
            .Cells(i, 6).Value = Cheval.statut
            .Cells(i, 7).Value = Cheval.oeilleres
            .Cells(i, 8).Value = Cheval.proprietaire
            .Cells(i, 9).Value = Cheval.entraineur
            .Cells(i, 10).Value = Cheval.driver

            '... etc ...

            i = i + 1
        End With
    Next Cheval

    Set Ecurie = Nothing
    Set PMU = Nothing
    Set ScriptControl = Nothing
End Sub

Pierre

Bah merci bcp ça marche

Ok,

Il y a un traitement spécial pour les données encapsulées cf robe, gainsParticipant, et autre :

Sub Turf()
Dim ScriptControl As Object, PMU As Object
Dim Ecurie As Object, Cheval As Object, Rb As Object, Gp As Object
Dim Site As String, i As Long

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

    Site = "https://www.pmu.fr/services/turfInfo/client/1/programme/18012016/R1/C1/participants"
    With CreateObject("MSXML2.XMLHTTP")
        .Open "GET", Site, False
        .send
        Set PMU = ScriptControl.Eval("(" + .responseText + ")")
        .abort
    End With

    i = 2
    Set Ecurie = PMU.participants
    On Error Resume Next
    For Each Cheval In Ecurie
        With ActiveSheet
            .Cells(i, 1).Value = Cheval.nom
            .Cells(i, 2).Value = Cheval.numPmu
            .Cells(i, 3).Value = Cheval.age
            .Cells(i, 4).Value = Cheval.sexe
            .Cells(i, 5).Value = Cheval.race
            .Cells(i, 6).Value = Cheval.statut
            .Cells(i, 7).Value = Cheval.oeilleres
            .Cells(i, 8).Value = Cheval.proprietaire
            .Cells(i, 9).Value = Cheval.entraineur
            .Cells(i, 10).Value = Cheval.deferre
            .Cells(i, 11).Value = Cheval.driver
            .Cells(i, 12).Value = Cheval.driverChange

            Set Rb = Cheval.robe
            .Cells(i, 13).Value = Rb.code 'libelleCourt
            .Cells(i, 14).Value = Rb.libelleLong

            .Cells(i, 15).Value = Cheval.indicateurInedit
            .Cells(i, 16).Value = Cheval.musique
            .Cells(i, 17).Value = Cheval.nombreCourses
            .Cells(i, 18).Value = Cheval.nombreVictoires
            .Cells(i, 19).Value = Cheval.nombrePlaces

            Set Gp = Cheval.gainsParticipant
            .Cells(i, 20).Value = Gp.gainsCarriere
            .Cells(i, 21).Value = Gp.gainsVictoires

            '... etc ...

            i = i + 1
        End With
    Next Cheval

    Set Rb = Nothing
    Set Gp = Nothing
    Set Ecurie = Nothing
    Set PMU = Nothing
    Set ScriptControl = Nothing
End Sub

sans oublier le On Error Resume Next pour les cases vides du json

Ok merci par contre comment tu fais pour les valeurs par exemple la colonne 20 celle ou c'est écrit gain carrière il y a dans le js deux zéro de trop par exemple, tous comme dans la colonne participants__poidsCondition il faudrait une virgule et aussi si je met la colonne participants__handicapValeur il y a un nombre avec un point, il va me la compter comme un texte ?

Si les valeurs des gains sont en centimes, il suffit de les diviser par 100 pour avoir des euros :

Set Gp = Cheval.gainsParticipant
.Cells(i, 20).Value = Gp.gainsCarriere / 100
.Cells(i, 21).Value = Gp.gainsVictoires / 100

Pour les valeurs avec décimales il suffit de dire par exemple:

Set Gp = Cheval.dernierRapportDirect
.Cells(i, 23).Value = Gp.nombreIndicateurTendance

0.66 sera lu comme 0,66

Ok merci bcp je vais tester tout ça et compléter le code car je ne vais pas garder toutes les lignes très gentils de ta part

Sinon une dernière chose sur cette page de js

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

82test.zip (11.37 Ko)

Je remet un autre fichier test pour les explications tous est dedans car je rame

103test.zip (61.68 Ko)

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/Web/JavaScript/Reference/Objets_globaux/eval

Ok merci bcp je vais essayer de compléter mon fichier et voir ce que ça donne

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 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
135test.zip (67.10 Ko)

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 "

    " & 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 "

    " & LaDate & "/R1/C5/participants"

c'est tout.

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

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

Merci bcp pierrep56 ça fait une journée que j'épluche des tutos pour trouver la solution

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.

Rechercher des sujets similaires à "importer json"