Bonsoir les ami(e)s (oui il fait nuit au vietnam )

j'ai utilisé l'enregistreur de macro (Excel 2013) pour marquer dans une cellule "AE6" une formule, qu'il copie et qu'il va copier en mode valeur sur une autre cellule P2


Hors lorsque j'utilise excell, il n'y a vraiment aucun problème : la cellule m'indique bien ce que je recherche soit : 0,26

Mais ... lorsque je lance la macro ... il me dit ... : *****...***** (j'ai du censurer tellement ce n'est pas agréable à entendre... ahaha)

En gros la macro sur la cellule "AE6" va chercher sur la feuille "JSON", colonne "A:A", où se situe la ligne de cette feuille qui contient les informations "energy_per_min" et extrait l'information de la cellule qu'il trouve

en gros il extrait ca :

Code JSON : Sélectionner tout - Visualiser dans une fenêtre à part
    "energy_per_min": 0.26,

la formule me calcule où se situe ":" et me donne le nombre de caractère où se situe l'information (car le nombre 0,26 peut changer ca peut être par exemple 3000 comme 0,1)
de là ... il extrait le reste, calcul le nombre de caractère restant, calcule où est le caractère "," et le déduit, pour enfin avoir le résultat 0,26 qu'il transforme en valeur numérique.

(pouah .. j'espère que ce n'est pas trop compliqué à comprendre )

voici la macro tiré de la formule écrite sur la cellule AE6 d'Excel :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
                    '   Energie / minute
                    Range("AE6").Select
                    ActiveCell.FormulaR1C1 = _
                        "=NUMBERVALUE(MID((INDEX(Json!C[-30],(MATCH(""*""&""energy_per_min""&""*"",Json!C[-30],0)),1,1)),(FIND("":"",(INDEX(Json!C[-30],##(MATCH(""*""&""energy_per_min""&""*"",Json!C[-30],0)),1,1)),1))+2,((LEN((INDEX(Json!C[-30],(MATCH(""*""&""energy_per_min""&""*"",Json!C[-30],0)),1,1)))-2)-(FIND("":"",(INDEX(Json!C[-30],(MATCH(""*""&""energy_per_min""&""*"",Json!C[-30],0)),1" & _
                        ")),""."")"
                        Selection.Copy
                    Range("P2").Select
                        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
                            :=False, Transpose:=False
j'ai essayé de mettre le code VBA sous balise, mais à priori je n'y arrive pas (excusez moi ^^)

=> je colle en "valeur" sur la cellule P2 car après avoir extrait les infos qui m'intéressent, je supprime la colonne "A:A" de la Feuille "JSON", donc si je marque sur la feuille excel sur la cellule P2 directement la formule, ca m'indique une erreur. (forcement )

et je supprime la colonne "A:A" pour alléger considérablement le fichier Excel (cette colonne comporte plus de 123 000 ligne sinon... et le fichier excel plusieurs Méga Octets ... )

=> je ne comprends vraiment pas d'où vient le problème, puisque en utilisant excel sans macro... tout fonctionne et il m'indique bien sur la cellule AE6 : 0,26

alors, j'ai fait un test sur la feuille excel :

Feuille JSON ligne (cellule BA3): =EQUIV("*"&"energy_per_min"&"*";Json!A:A;0),
ça m'indique bien la ligne 17 de la feuille JSON colonne A:A
ce qui est correct

Feuille JSON texte (cellule BA4): = (INDEX(Json!A:A;(EQUIV("*"&"energy_per_min"&"*";Json!A:A;0));1;1)),
ça m'indique bien le texte recherché soit : "energy_per_min": 0.26,

Position du caractère *:* (cellule BA7): = (TROUVE(":";BA4;1)),
ça m'indique la valeur correcte : 21

Nombre total de caractère - "," (cellule BA9): = (NBCAR(BA4)-2),
ça m'indique la valeur correcte : 25
(-2 car j'ai à priori des espaces dans la chaine de caractères)

Test final : = VALEURNOMBRE(STXT(BA4;BA7+2;(BA9-BA7));"."),
et là ça m'indique bien en numéraire: 0,26

j'ai remplacé les valeurs des différentes cellules par leurs formules respectives :

Copie ta formule (cellule BA13) : =VALEURNOMBRE(STXT((INDEX(Json!A:A;(EQUIV("*"&"energy_per_min"&"*";Json!A:A;0));1;1));(TROUVE(":";(INDEX(Json!A:A;(EQUIV("*"&"energy_per_min"&"*";Json!A:A;0));1;1));1))+2;((NBCAR((INDEX(Json!A:A;(EQUIV("*"&"energy_per_min"&"*";Json!A:A;0));1;1)))-2)-(TROUVE(":";(INDEX(Json!A:A;(EQUIV("*"&"energy_per_min"&"*";Json!A:A;0));1;1));1))));".")
=> là cela m'indique bien : 0,26

mais lorsque je l'enregistre en macro via l'enregistreur, ça me fait une grosse erreur

même en supprimant le retour de ligne, la macro m'indique une erreur :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
                    Range("AE6").Select
                    ActiveCell.FormulaR1C1 = _
                        "=NUMBERVALUE(MID((INDEX(Json!C[-30],(MATCH(""*""&""energy_per_min""&""*"",Json!C[-30],0)),1,1)),(FIND("":"",(INDEX(Json!C[-30],(MATCH(""*""&""energy_per_min""&""*"",Json!C[-30],0)),1,1)),1))+2,((LEN((INDEX(Json!C[-30],(MATCH(""*""&""energy_per_min""&""*"",Json!C[-30],0)),1,1)))-2)-(FIND("":"",(INDEX(Json!C[-30],(MATCH(""*""&""energy_per_min""&""*"",Json!C[-30],0)),1" & ")),""."")"
peut-on faire un truc du genre :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
a = "energy_per_min"   (comme ca je peux l'adapter à n'importe quelle recherche)
b = EQUIV("*"& a &"*";Json!A:A;0)
c = (INDEX(Json!A:A;(EQUIV("*"& a &"*";Json!A:A;0));1;1))
d = (TROUVE(":"; c ;1))
e = (NBCAR( c )-2)
f = VALEURNOMBRE(STXT(BA4;BA7+2;(BA9-BA7));".")  => VALEURNOMBRE(STXT(c;d+2;(e-d);".")
est-ce possible ?

Par avance merci pour toute l'aide que vous pourrez m'apporter (et je vous souhaite une agréable fin de journée )