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

Je viens de constater qu'il y a un problème lorsqu'on clique sur le point.

Ca bug sur cette ligne :
VB:
If Len(expression) = 0 Or Right(expression, " ") Then

Peut-être est-ce quelque chose comme ceci que tu voulais en fait écrire :
VB:
If Len(expression) = 0 Or Right(expression,1) = " " Then
Mais à quelle occasion Expression peut-elle se terminer par une espace ?



Le comportement du "+/-" est également étrange...
 
Dernière édition:
re
et je pense aussi avoir résolu
le problème du calcul des pourcentage en modifiant la formulation
en la remplaçant par le coeff multiplicateur correspondant
exemple
-10%= *0.9
+10%=*1.10
VB:
' 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
 
Bien vu @sylvanu
et oui les replace successifs j'ai pas cogité ça

@vgendron
bonjour à tous
je n'ai pas lu tout le fil, mais juste pour répondre a ce que je cite au dessus
non..
92-10% c'est censé etre 91.9
92-10%
=92-0.1=91.9

dans ton esprit, c'est 92 - 10% DE 92
et.. ca s'écrit:
92-10%*92

si tu ne précises pas le 10% de quoi.. alors. le quoi = 1
??????????????????????
10% de 92 ca fait 9.20
92-9.20 ca fait 82.80 chez moi

le problème avec ta formulation @sylvanu c'est quelle n'est pas bonne
le "-10%" on comprend
mais le "+10%" qui suit veut rien dire car +10% de quoi ?
sinon oui c'est corrigé mais ca veut rien dire
VB:
' 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) & ")"): ex(i) = ""
            If InStr(expr, "+" & Val(ex(i)) & "%") > 0 Then expr = Replace(expr, "+" & ex(i), "*(" & 1 + (Val(ex(i)) / 100) & ")"): ex(i) = ""
        End If
    Debug.Print expr
    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
 
Bien vu @sylvanu
et oui les replace successifs j'ai pas cogité ça

@vgendron

??????????????????????
10% de 92 ca fait 9.20
92-9.20 ca fait 82.80 chez moi

le problème avec ta formulation @sylvanu c'est quelle n'est pas bonne
le "-10%" on comprend
mais le "+10%" qui suit veut rien dire car +10% de quoi ?
sinon oui c'est corrigé mais ca veut rien dire
VB:
' 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) & ")"): ex(i) = ""
            If InStr(expr, "+" & Val(ex(i)) & "%") > 0 Then expr = Replace(expr, "+" & ex(i), "*(" & 1 + (Val(ex(i)) / 100) & ")"): ex(i) = ""
        End If
    Debug.Print expr
    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
Bonjour @patricktoulon , votre code à l'air de correspondre dans tous les sens, si toutefois vous avez une idée pour alléger l'emsemble je suis preneuse. Nathe. Et merci
 
Hello,
pour le fun je me suis amusé à mapper la calculatrice de Nathe sur la calculatrice de Windows avec UIAutomation. C'est à dire que lorsque l'on clique sur un bouton de la calculatrice de Nathe, le clic se produit aussi sur la calculatrice Windows.
Cela n'est pas trop compliqué :
1 - On lance la calculatrice windows (en français) et on la met dans le mode qui va bien ( ex: Standard).
2 - Dans le code de Nathe j'ai rajouté les codes suivants :
A l'initialisation du formulaire on liste tous les éléments d'interface graphique de la calculatrice Windows et on les met dans un dictionnaire
qui contient en clé leur nom et en valeur l'élément lui-même :
VB:
Private Sub UserForm_Initialize()
    ' Définir le symbole p dans le bouton
    InitBoutons
    Me.CommandButtonPi.Caption = ChrW(&H3C0)  ' Unicode pour p
End Sub

Code:
Sub InitBoutons()
Dim c As New CUIAutomation, oCalc As IUIAutomationElement
Dim oDesktop As IUIAutomationElement
Set oDesktop = c.GetRootElement
Set oCalc = WaitForUiElem(c, oDesktop, "Name", "Calculatrice", _
                            TreeScope_Children, 2) ' Recherche de la fenêtre Calculatrice
Set DicoBtns = DicoUIAelems(c, oCalc) 'Récupérer les éléments graphiques de la calculatrice
End Sub

Avec la procédure Simu dans le code du formulaire, qui simule un clic de bouton dans la calculatrice Windows et le rajout de cette procédure dans les clics de touches
Code:
Private Sub Simu(touche)
 On Error Resume Next
 GetIacc(DicoBtns(touche)).DoDefaultAction
End Sub
Private Sub CommandButton0_Click()
    AjouterChiffre "0"
    Simu "Zéro"
End Sub
Private Sub CommandButton1_Click()
    AjouterChiffre "1"
    Simu "Un"
End Sub
' Calcul du résultat
Private Sub btnEgal_Click()
    CalculerResultat
    Simu "Est égal à"
End Sub
A noter que dans la calculatrice en mode Standard de Windows il n'y a pas les parenthèses qui sont présentes en mode Scientifique mais dans
ce mode il n'y a pas de pourcentage.
En pièce jointe un classeur qui contient le code de Nathe, le dernier de Patrick et un module de gestion UIAutomation. UIAutomationclient est coché dans les références. Testé avec Excel 2016 sous Windows 11 et Excel 2019 sous Windows 10 .
Ne fonctionne pas sous Windows 7 (calculatrice différente et UIAutomation pas au top).

Calculatrice.gif


A noter le souci sur le +/-

Ami calmant, J.P
 

Pièces jointes

Dernière édition:
- 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
788
Réponses
9
Affichages
292
Retour