1 pièce(s) jointe(s)
Evaluate : refuse la recursivité
Bonjour a tous.Pièce jointe 213868
j'ai trouvé un soucis, qu'on a fini par clairement identifier / carractériser, mais sans explication ni solution.
a part recoder complètement Evaluate, je ne vois pas quoi faire.
voila ma fonction :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
| Sub Bouton_Cliquer() temp = InputBox("Formule, EN ANGLAIS (, au lieu de ;)", "ReadValue(A1,3)")
temp2 = Evaluate(CStr(temp))
MsgBox (temp3)
End Sub
Public Function ReadValue(valeur As Variant, Reference As Long) As Variant
'lis une des valeur d'une matrice textuelle
Dim Tableau() As String
Dim temp As Variant
If valeur = "" Then
ReadValue = ""
Exit Function
End If
'découpe la chaine en fonction des espaces " "
'le résultat de la fonction Split est stocké dans un tableau
'il faudra commencer par trier les données pour s'assurer qu'il n'y a pas de "coupe" entre guillemet (plus tard)
Tableau = Split(valeur, "|")
'boucle sur le tableau pour visualiser le résultat
Select Case Reference
Case Is <= 0
ReadValue = UBound(Tableau) + 1
'dans le cas négatif ou =0, retourne le NOMBRE de référence dispo
Case Else
If Reference > UBound(Tableau) + 1 Then Exit Function
temp = CStr(Tableau(Reference - 1))
'temp = ChangeLangueFormule(CStr(temp))
ReadValue = Evaluate(CStr(temp)) '<<<<======= c'est cette fonction qui plante.
'ReadValue = temp '<<<==== si on remplace par celle ci, ca marche/
'dans le cas positif, retourne le résultat de l'index
End Select
End Function |
mettez ce code dans un module
le but est le suivant, si vous avez la cellule A1 où est écrit, par exemple :
12|24|Sum(D:D)|38
écrivez dans une cellule :
résultat : 12
résultat : 24
résultat : 38
le truc spécial, c'est
résultat : la somme de la colonne D
ok, si vous l'écrivez ainsi, en formule, tout marche, rien a redire.
toutefois, le soucis, c'est que dans mon code complet, je laisse l'utilisateur écrire lui même un texte "ReadValue"
pour reproduire le bug, donc, maintenant que vous avez vu que ma fonction ... fonctionne.
creez un bouton ou autre, et cette fois ci, utilisez la procédure bouton, pour entrer dans l'input box :
en théorie, ca devrait marcher, et retourner la somme de D
=> ERREUR 2015 !
pourtant, c'est écrit en anglais, RAS.
essayez sur des valeurs sans formule, par exemple
en théorie, ca devrait retourner 12
=> ERREUR 2015 Oo !!!
dans le doute, passez en commentaire la ligne du "evaluate" de ma fonction, pour mettre à la place celle au dessous.
code :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
| Sub Bouton_Cliquer() temp = InputBox("Formule, EN ANGLAIS (, au lieu de ;)", "ReadValue(A1,3)")
temp2 = Evaluate(CStr(temp))
MsgBox (temp3)
End Sub
Public Function ReadValue(valeur As Variant, Reference As Long) As Variant
'lis une des valeur d'une matrice textuelle
Dim Tableau() As String
Dim temp As Variant
If valeur = "" Then
ReadValue = ""
Exit Function
End If
'découpe la chaine en fonction des espaces " "
'le résultat de la fonction Split est stocké dans un tableau
'il faudra commencer par trier les données pour s'assurer qu'il n'y a pas de "coupe" entre guillemet (plus tard)
Tableau = Split(valeur, "|")
'boucle sur le tableau pour visualiser le résultat
Select Case Reference
Case Is <= 0
ReadValue = UBound(Tableau) + 1
'dans le cas négatif ou =0, retourne le NOMBRE de référence dispo
Case Else
If Reference > UBound(Tableau) + 1 Then Exit Function
temp = CStr(Tableau(Reference - 1))
'temp = ChangeLangueFormule(CStr(temp))
'ReadValue = Evaluate(CStr(temp)) '<<<<======= c'est cette fonction qui plante.
ReadValue = temp '<<<==== si on remplace par celle ci, ca marche/
'dans le cas positif, retourne le résultat de l'index
End Select
End Function |
alors cette fois ci, les résultat :
Retourne bien 12; cette fois ci, ca marche.
Retourne "SUM(D:D)" mais sans l'appliquer. ca marche, mais c'est pas ce que je souhaite !
Conclusion :
impossible d'appliquer un EVALUATE depuis une fonction deja lancé par un EVALUATE.
comment contourner ce soucis ? comment appliquer mon evaluate au clic bouton pour obtenir le même effet que si je l'avais entré dans une cellule en tant que formule ?
évidement, mon projet complet est bien plus complexe que ca, et donc, je dois avoir une fonction "universelle" de "readvalue" qui fonctionne et s'adapte à tout les cas.
ca fait 2 jours que je m'arrache les cheveux dessus, et je commence a sérieusement envisager de faire un traitement de chaine de carra pour décompiler en petit bout les formule pour les "callbyname" ... autrement dit ... recoder à la main evaluate. rien que ca.
si quelqu'un a la moindre solution, parce que là, je pète un câble.
En vous remerciant par avance.
Cordialement.