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