XL 2010 Evaluation d'expression mathématique

vgendron

XLDnaute Barbatruc
Bonjour à toutes et tous !!
Me revoici avec un nouveau problème à vous soumettre..
Je souhaite évaluer une expression mathématique transmise sous forme de string.
Cette expression mathématique est dépourvue de tout espace (ils sont supprimés en amont)
elle est donc constituée des opérateurs + - * /, de parenthèses ( ) et de nom de variables

ci dessous le code


VB:
Function EvalExpressionMath(TempsAjout, Optional step) As Double
Dim TempsAjoutTemp As String
Dim ListeOpérande() As String
Dim j As Long
Dim ValParam As Long
TempsAjout = Replace(TempsAjout, ".", ",") 'on remplace le . par une , pour le signe numérique

        'Temps Ajout peut etre numérique ou nom de paramètre
        If IsNumeric(TempsAjout) Then
            EvalExpressionMath = EvalExpressionMath + CDbl(TempsAjout)
        Else
            TempsAjoutTemp = Replace(TempsAjout, "+", " ") 'on remplace tous les opérateurs et parenthèses par des espaces
            TempsAjoutTemp = Replace(TempsAjoutTemp, "-", " ")
            TempsAjoutTemp = Replace(TempsAjoutTemp, "*", " ")
            TempsAjoutTemp = Replace(TempsAjoutTemp, "/", " ")
            TempsAjoutTemp = Replace(TempsAjoutTemp, "%", " ")
            TempsAjoutTemp = Replace(TempsAjoutTemp, "(", " ")
            TempsAjoutTemp = Replace(TempsAjoutTemp, ")", " ")

            'on peut donc séparer tous les élements de l'expression mathématique
            ListeOpérande = Split(Trim(TempsAjoutTemp), " ")
            For j = LBound(ListeOpérande) To UBound(ListeOpérande) 'on remplace chaque opérande par sa valeur
                If Not IsNumeric(ListeOpérande(j)) Then 'si on est sur un paramètre type "NomVariable", on le cherche pour le remplacer dans l'expression
                    If ListeOpérande(j) <> "" Then
                        'on recherche la valeur du paramètre
                        ValParam = ChercheValDuParam(CStr(ListeOpérande(j)), step)
                       
                        'et on remplace sa valeur dans l'expression mathématique ===> C'est ici que ca coince
                        TempsAjout = Replace(TempsAjout, ListeOpérande(j), ValParam)
                    End If
                End If
            Next j
            TempsAjout = WorksheetFunction.Substitute(TempsAjout, ",", ".") 'permet de repasser avec le séparateur numéric "."
            EvalExpressionMath = EvalExpressionMath + Evaluate(TempsAjout)
        End If
End Function

le problème apparait lorsque deux "NomVariable" commencent par le meme nom... (Tolerance et Tolerance_Bis)
ex: avec la chaine testée:
Ph_Current_Max*(1+Tolerance)+Tolerance_Bis

Selon le déroulement de la fonction ci dessus,
Ph_Current_Max est trouvé dans un tableau "ListeOpérande, grace à la fonciton ChercheValDuParam (qui se contente de chercher le nom du paramètre et récupère sa valeur: 2)
ensuite.. lorsque la fonction passe à Tolerance, idem, elle trouve sa valeur. puis remplace Tolerance par la valeur.. sauf que.. elle remplace AUSSI le deuxième paramètre (Tolerance_Bis qui devient 2_Bis)
du coup.. par la suite.. Tolerance_Bis, n'est plus trouvé dans la chaine d'origine...

auriez vous une idée de comment je peux
1) séparer les différents éléments de la chaine à evaluer (opérateurs et opérandes)
2) remplacer UNIQUEMENT le paramètre exact par sa valeur...
 

vgendron

XLDnaute Barbatruc
Hello Sylvanu

Je l'ai effectivement. mais je ne l'ai pas posté car cette fonction fait elle meme appel à d'autres fonctions et feuilles du classeur......

mais c'est bon. je crois avoir trouvé la solution..
plutot qu'utiliser la fonction replace . qui remplace TOUTES les occurences dans la chaine, j'utilise un mix avec les fonctions MID, REPT et replace

je remets mon nouveau code ci dessous.. ca peut toujours servir pour inspirer d'autres personnes.. :-D
VB:
Function EvalExpressionMath(TempsAjout, Optional step) As Double
Dim TempsAjoutTemp As String
Dim ListeOpérande() As String
Dim j, ici As Long
Dim ValParam As Long
TempsAjout = Replace(TempsAjout, ".", ",") 'on remplace le . par une , pour le signe numérique

        'Temps Ajout peut etre numérique ou nom de paramètre
        If IsNumeric(TempsAjout) Then
            EvalExpressionMath = EvalExpressionMath + CDbl(TempsAjout)
        Else
            TempsAjoutTemp = Replace(TempsAjout, "+", " ") 'on remplace tous les opérateurs et parenthèses par des espaces
            TempsAjoutTemp = Replace(TempsAjoutTemp, "-", " ")
            TempsAjoutTemp = Replace(TempsAjoutTemp, "*", " ")
            TempsAjoutTemp = Replace(TempsAjoutTemp, "/", " ")
            TempsAjoutTemp = Replace(TempsAjoutTemp, "%", " ")
            TempsAjoutTemp = Replace(TempsAjoutTemp, "(", " ")
            TempsAjoutTemp = Replace(TempsAjoutTemp, ")", " ")

            'on peut donc séparer tous les élements de l'expression mathématique
            ListeOpérande = Split(Trim(TempsAjoutTemp), " ")
            For j = LBound(ListeOpérande) To UBound(ListeOpérande) 'on remplace chaque opérande par sa valeur
                If Not IsNumeric(ListeOpérande(j)) Then 'si on est sur un paramètre type "NomVariable", on le cherche pour le remplacer dans l'expression
                    If ListeOpérande(j) <> "" Then
                        'on recherche la valeur du paramètre
                        ValParam = ChercheValDuParam(CStr(ListeOpérande(j)), step)
                        ici = InStr(1, TempsAjout, ListeOpérande(j)) 'position du paramètre dans la chaine initiale
                        'dans la chaine initiale, on remplace le Paramètre par "la variable + des espaces pour completer
                        'on ne peut pas remplacer 10 caractères par seulement 2 ==> il faut que les longueurs correspondent
                        Mid(TempsAjout, ici, Len(ListeOpérande(j))) = ValParam & WorksheetFunction.Rept(" ", Len(ListeOpérande(j)) - Len(CStr(ValParam)))
                        'et on supprime les espaces
                        TempsAjout = Replace(TempsAjout, " ", "")
                    End If
                End If
            Next j
            TempsAjout = WorksheetFunction.Substitute(TempsAjout, ",", ".") 'permet de repasser avec le séparateur numéric "."
            EvalExpressionMath = EvalExpressionMath + Evaluate(TempsAjout)
        End If
End Function
 

Discussions similaires

Statistiques des forums

Discussions
311 725
Messages
2 081 943
Membres
101 849
dernier inscrit
florentMIG