' 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