' Fonction pour calculer le résultat de l'expression
Private Sub CalculerResultat()
'remastered the percent operation by patricktoulon
Dim Resultat As Variant
Dim expr As String
Dim t, symb, ex, i
symb = Split("+,-,x,/,*", ",")
' Vérifie si l'expression est vide
If Len(expression) = 0 Then Exit Sub
' Remplacement des erreurs de formatage
expr = Replace(expression, "x", "*") ' Remplace "x" par "*" pour Evaluate
expr = Replace(expr, ",", ".") ' Remplace les virgules par des points (format anglais)
ex = expr 'on clone expr
ex = Replace(Replace(ex, "(", ""), ")", "") 'on replace les parenthèses dans le clone
For i = 0 To UBound(symb) 'boucle sur les symbols
ex = Replace(ex, symb(i), "|") 'on les replace par un separateur indentique
Next
ex = Split(ex, "|") 'on coupe le clone de expr (ex) par le separateur
For i = 0 To UBound(ex) 'on boucle sur les item du split du clone
'si il y a un "%" dans la chaine de l'element du split
' on replace ce pourcentage cette fois ci ddans le expr par la formule | "*(1 - " & Val(ex(i)) & "/100)" |(+ ou -)
If InStr(ex(i), "%") Then
' MsgBox Val(ex(i))juste pour voir si la formule est bonne
If InStr(expr, "-" & Val(ex(i)) & "%") > 0 Then expr = Replace(expr, ex(i), "*(" & 1 - (Val(ex(i)) / 100) & ")")
If InStr(expr, "+" & Val(ex(i)) & "%") > 0 Then expr = Replace(expr, ex(i), "*(" & 1 + (Val(ex(i)) / 100) & ")")
End If
Next
'on replace les symbols double(-* ou +* etc... dans expr
expr = Replace(Replace(Replace(Replace(expr, "-*", "*"), "+*", "*"), "**", ""), "/*", "")
'je laisse le msgbox mais il faudra l'enlever
MsgBox expr
' Essayer d'évaluer l'expression
On Error Resume Next
Resultat = Evaluate(Replace(expr, ",", ".")) ' Évalue l'expression
On Error GoTo 0
' Vérification et affichage du résultat
If IsError(Resultat) Or IsEmpty(Resultat) Then
Me.txtValeur = "Erreur"
Else
If Resultat = Int(Resultat) Then
Me.txtValeur = Format(Resultat, "0")
Else
Me.txtValeur = Format(Resultat, "0.00")
End If
DernierResultat = Me.txtValeur ' Stocke le dernier résultat pour la continuité
End If
' Met à jour l'affichage avec le signe égal
Me.txtExpression = expression & "=" & Me.txtValeur ' Conserve l'expression avec le signe égal
End Sub