XL 2019 Problème calcul % sur calculatrice

  • Initiateur de la discussion Initiateur de la discussion Nathe
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Nathe

XLDnaute Junior
Bonjour à toutes et tous,

Je suis en train d'essayer de monter un projet calculatrice sur excel mais je peine sur l'adaptation du calcul du pourcentage,
Si une personne saurai comment effectué le code qui irai bien.

Merci à tous
Nathe

Animation.gif
 

Pièces jointes

Vu la quantité de code à ajouter pour une simple opération vaut mieux retirer cette fonction qui est rarement utilisée

Moi je souhaite la faire utiliser, elle devrait tenir sur ces 2 fonctions :

VB:
' 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

A oui, Bonjour quand même.
 
Ah oui là on est completement à coté
le developpement n'est pas bon
etape2:36+64 ???????????
et si on devait s'amuser à developper par exemple "((4*5)/(2/0.7)) ben ça plante forcement
je pense que pour bien développer il faudrait transformer ça en JSON ce qui nous permettrait de pouvoir déterminer les sous ensemble
et analyser les segments
mais c'est un boulot de fou
je serait toi je m'y tenterais même pas
le regex c'est bien beau mais ça ne fait pas le raisonnement
peut être aussi en html en remplaçant les parenthèses par des balises et ainsi pouvoir décanter correctement les segments child
1740482603293.png

mais là comme ça c'est même pas la peine c'est absolument pas la bonne méthode pour développer
je ne sa"is pas qui t'a donner l'idée de le faire avec le regex mais c'est pas bon il y a beaucoup trop de case de figure
 
Voici un extrait de l'évaluation d'une expression par J.P Zanotti qui commence par ce que fait patricktoulon avec son html ( découpage en jetons)
Présentation du problème
On souhaite évaluer une expression arithmétique (ou logique), par exemple l'expression
1.2 * (8 - 3) * 3 + ((3 - 1) * 2) 3
.
Pour en calculer la valeur, il faut franchir plusieurs étapes qui font l'objet d'un exercice classique d'un cours de théorie des langages que nous n'aborderons ici que très superficiellement et de manière simplifiée. La première est l'analyse lexicale qui consiste à découper la suite des symboles qui constituent l'expression en unités lexicales ou jetons. Ces jetons doivent respecter des règles syntaxiques, suite de chiffres pour un entier, suite de chiffres contenant éventuellement un point pour les nombres réels, symbole unique
pour les opérateurs arithmétiques, etc.

L'expression ci-dessus fournit la liste de jetons suivante (la nature de chaque jeton est indiquée, valeur numérique, opérateur binaire, unaire, parenthèse gauche, parenthèse droite) :
1.2 * ( 8 - 3 ) * 3 + ( ( 3 - 1 ) * 2 ) * 3
NUM BIN PRG NUM BIN NUM PRD BIN NUM BIN PRG PRG NUM BIN NUM PRD BIN NUM PRD BIN NUM

 
re @jurassic pork
Attention là je ne traite que les parenthèses
j'attendais de voir si il y a du monde intéressé
donc arrivé a l’opération simplifier il faut que je remasterise la chaine avec des nouvelles parenthèses pour encapsuler les multiplication prioritaire
si j'arrive a faire ca je couvre 95% du travail
mais ton id de bin là est intéressante justement et j'ai la lumière qui c'est allumée

exemple mon resultat actuel avec ma fonction qui me permet de determiner les jeton
autrement dit on voi ici que je modifie la formule au fur et a mesure jusqu'a ne plus avoir de parenthèses
Original : ((4x5)/(2/0.7))x2+((12x1.7)/1.5)

Etape 1: (12x1.7)= 20,40
((4x5)/(2/0.7))x2+(20,40/1.5)

Etape 2: (2/0.7)= 2,86
((4x5)/2,86)x2+(20,40/1.5)

Etape 3: (4x5)= 20,00
(20/2,86)x2+(20,40/1.5)

Etape 4: (20.40/1.5)= 13,60
(20/2.86)x2+13,60

Etape 5: (20/2.86)= 6,99
6,99x2+13,60
 
re @jurassic pork
Attention là je ne traite que les parenthèses
j'attendais de voir si il y a du monde intéressé
donc arrivé a l’opération simplifier il faut que je remasterise la chaine avec des nouvelles parenthèses pour encapsuler les multiplication prioritaire
si j'arrive a faire ca je couvre 95% du travail
mais ton id de bin là est intéressante justement et j'ai la lumière qui c'est allumée

exemple mon resultat actuel avec ma fonction qui me permet de determiner les jeton
autrement dit on voi ici que je modifie la formule au fur et a mesure jusqu'a ne plus avoir de parenthèses
Original : ((4x5)/(2/0.7))x2+((12x1.7)/1.5)

Etape 1: (12x1.7)= 20,40
((4x5)/(2/0.7))x2+(20,40/1.5)

Etape 2: (2/0.7)= 2,86
((4x5)/2,86)x2+(20,40/1.5)

Etape 3: (4x5)= 20,00
(20/2,86)x2+(20,40/1.5)

Etape 4: (20.40/1.5)= 13,60
(20/2.86)x2+13,60

Etape 5: (20/2.86)= 6,99
6,99x2+13,60
maintenant il faut je refasse une conversion html pour reconstruire des jetons
en l’occurrence ici
6,99x2+13,60 deviendrait (6,99x2)+13,60
ainsi converti en html >FONT><A>6.99x2</A>+13.60</FONT>
et avec mon parseur encore une fois je evaluate les balise A et je replace les(....) par le résultat dans la formule

ce qu'il faut comprendre
c'est que je m'occupe des balises de dernier level jusqu'au level 0 (comme on le voit dans mon développement ) donc je ne peux pas manquer une priorité
j'arrive a indenter 3200 lignes de code avec du html c'est pas une petite opé qui va m'arrêter🤣 🤣
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
17
Affichages
782
Réponses
9
Affichages
275
Réponses
3
Affichages
77
Retour