' Fonction pour évaluer et détailler le calcul
Private Sub CalculerResultat()
Dim Expr As String, Resultat As Variant
Dim Developpement As String
Dim etape As Integer
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)
On Error Resume Next
Resultat = Evaluate(Expr)
On Error GoTo 0
If IsError(Resultat) Or IsEmpty(Resultat) Then
Me.txtValeur = "Erreur"
Exit Sub
End If
' Début du développement
Developpement = "Développement :" & vbCrLf
Developpement = Developpement & "Expression initiale : " & expression & vbCrLf
etape = 1
' Décomposer les calculs avec respect des priorités
Developpement = Developpement & EvaluerEtapes(Expr, etape)
' Afficher le résultat final
Developpement = Developpement & "Résultat final : " & Format(Resultat, "0.0")
Me.txtDeveloppement.Text = Developpement
' Affichage du résultat final
Me.txtValeur = Resultat
DernierResultat = Me.txtValeur ' Stocke le dernier résultat
Me.txtExpression = expression & "=" & Me.txtValeur
End Sub
' Fonction récursive pour analyser et afficher chaque étape du calcul
Private Function EvaluerEtapes(ByVal Expr As String, ByRef etape As Integer) As String
Dim RegEx As Object, Match As Object, Matches As Object
Dim Result As Variant, SousExpr As String, Calcul As Variant
Dim SousCalcul As String, TexteEtape As String
Set RegEx = CreateObject("VBScript.RegExp")
RegEx.Global = True
RegEx.IgnoreCase = False
RegEx.MultiLine = False
' Étape 1 : Calcul des pourcentages
RegEx.Pattern = "(\d+\.?\d*)%"
Do While RegEx.Test(Expr)
Set Matches = RegEx.Execute(Expr)
For Each Match In Matches
SousExpr = Match.Value
' Conversion du pourcentage en valeur décimale
Calcul = Evaluate(Replace(SousExpr, "%", "")) / 100
TexteEtape = "Étape " & etape & " : " & SousExpr & " = " & Format(Calcul, "0.0") & vbCrLf
Expr = Replace(Expr, SousExpr, Calcul, 1, 1)
etape = etape + 1
EvaluerEtapes = EvaluerEtapes & TexteEtape
Next
Loop
' Étape 2 : Calcul des parenthèses
RegEx.Pattern = "\(([^()]+)\)"
Do While RegEx.Test(Expr)
Set Matches = RegEx.Execute(Expr)
For Each Match In Matches
SousExpr = Match.SubMatches(0)
Calcul = Evaluate(SousExpr)
TexteEtape = "Étape " & etape & " : " & SousExpr & " = " & Format(Calcul, "0.0") & vbCrLf
Expr = Replace(Expr, "(" & SousExpr & ")", Calcul, 1, 1)
etape = etape + 1
EvaluerEtapes = EvaluerEtapes & TexteEtape
Next
Loop
' Étape 3 : Calcul des multiplications et divisions
RegEx.Pattern = "(\d+\.?\d*)[*/](\d+\.?\d*)"
Do While RegEx.Test(Expr)
Set Matches = RegEx.Execute(Expr)
For Each Match In Matches
SousCalcul = Match.Value
Calcul = Evaluate(SousCalcul)
TexteEtape = "Étape " & etape & " : " & SousCalcul & " = " & Format(Calcul, "0.0") & vbCrLf
Expr = Replace(Expr, SousCalcul, Calcul, 1, 1)
etape = etape + 1
EvaluerEtapes = EvaluerEtapes & TexteEtape
Next
Loop
' Étape 4 : Calcul des additions et soustractions
RegEx.Pattern = "(-?\d+\.?\d*)[+-](-?\d+\.?\d*)"
Do While RegEx.Test(Expr)
Set Matches = RegEx.Execute(Expr)
For Each Match In Matches
SousCalcul = Match.Value
Calcul = Evaluate(SousCalcul)
TexteEtape = "Étape " & etape & " : " & SousCalcul & " = " & Format(Calcul, "0.0") & vbCrLf
Expr = Replace(Expr, SousCalcul, Calcul, 1, 1)
etape = etape + 1
EvaluerEtapes = EvaluerEtapes & TexteEtape
Next
Loop
' Retourner les étapes de calcul
EvaluerEtapes = EvaluerEtapes & vbCrLf
End Function