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 :


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
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 : 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
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.