Bonjour a tous.Classeur2.xlsm
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 :
mettez ce code dans un module
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
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
Code : Sélectionner tout - Visualiser dans une fenêtre à part =ReadValue(A1, 1)
résultat : 24
Code : Sélectionner tout - Visualiser dans une fenêtre à part =ReadValue(A1, 2)
résultat : 38
Code : Sélectionner tout - Visualiser dans une fenêtre à part =ReadValue(A1, 4)
le truc spécial, c'est
résultat : la somme de la colonne D
Code : Sélectionner tout - Visualiser dans une fenêtre à part =ReadValue(A1, 3)
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
Code : Sélectionner tout - Visualiser dans une fenêtre à part readvalue(A1,3)
=> ERREUR 2015 !
pourtant, c'est écrit en anglais, RAS.
essayez sur des valeurs sans formule, par exemple
en théorie, ca devrait retourner 12
Code : Sélectionner tout - Visualiser dans une fenêtre à part readvalue(A1,1)
=> ERREUR 2015 Oo !!!
dans le doute, passez en commentaire la ligne du "evaluate" de ma fonction, pour mettre à la place celle au dessous.
code :
alors cette fois ci, les résultat :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
Retourne bien 12; cette fois ci, ca marche.
Code : Sélectionner tout - Visualiser dans une fenêtre à part readvalue(A1,1)
Retourne "SUM(D:D)" mais sans l'appliquer. ca marche, mais c'est pas ce que je souhaite !
Code : Sélectionner tout - Visualiser dans une fenêtre à part readvalue(A1,3)
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.
Partager