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
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.
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.
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
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
Je remet un autre fichier test pour les explications tous est dedans car je rame
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
.Cells(i, 1).Value = (DataSet.dateReunion / 86400000) + 25570
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
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.