Calculer une expression simple

Contenu du snippet

Private Function CalcEx(ByVal Text As String)
    '------------------------
    'Buffer de charactere
    Dim Char As String * 1
    'Mot temporaire
    Dim Word As String
    'Operateur en cours
    Dim Oprd As String
    '------------------------
    'Tableau d'operateurs indentés
    Dim Opr() As String
    'Tableau de valeurs indentées
    Dim Res() As Double
    'Valeur en cours
    Dim Value As Double
    '------------------------
    'Compteur d'indentation
    Dim j As Long
    'Variable de boucle
    Dim i As Long
    
    ReDim Res(0)
    ReDim Opr(0)
    
    Text = Text & " "
    For i = 1 To Len(Text)
        'Recuperation du charactere
        Char = Mid(Text, i, 1)
        'Selection en fonction de la valeur du charactere
        Select Case Char
        'Si c'est un chiffre ajoute dans le buffer
        Case "0" To "9": Word = Word & Char
        'Si c'est un point fait de meme /!\ regional settings /!\
        Case ".": Word = Word & Char
        'Si c'est un espace calcule l'expression
        Case " ": GoSub Calc
        'Si c'est une operation calcule et conserve l'operation en memoire
        Case "+": GoSub Calc: Oprd = Char
        Case "-": GoSub Calc: Oprd = Char
        Case "*": GoSub Calc: Oprd = Char
        Case "/": GoSub Calc: Oprd = Char
        Case "^": GoSub Calc: Oprd = Char
        Case "\": GoSub Calc: Oprd = Char
        'Si c'est une debut paranthese indente la valeur
        Case "(":
            'Redimentionne le tableau
            ReDim Preserve Res(j)
            ReDim Preserve Opr(j)
            'Sauve la valeur et l'operande
            Res(j) = Value
            Opr(j) = Oprd
            'Increment
            j = j + 1
            'Initialize les variables temporaires
            Value = 0
            Word = ""
            Oprd = ""
            
        'Si c'est une fin de paranthere decremente la hierarchie
        Case ")"
            'Si on n'est en indentation "positive"
            If j Then
                'Calcule l'expression
                GoSub Calc
                'Decremente
                j = j - 1
                'Si on dispose d'un operateur
                If Opr(j) = "" Then
                    'NOP
                Else
                    'Calcule
                    Select Case Opr(j)
                    Case "+": Value = Res(j) + Value
                    Case "-": Value = Res(j) - Value
                    Case "*": Value = Res(j) * Value
                    Case "/": Value = Res(j) / Value
                    Case "\": Value = Res(j) \ Value
                    Case "^": Value = Res(j) ^ Value
                    '-----------------------------------
                    'Extra fonction
                    Case "MOD": Value = Res(j) Mod Value
                    Case "AND": Value = Res(j) And Value
                    Case "XOR": Value = Res(j) Xor Value
                    Case "OR": Value = Res(j) Or Value
                    '-----------------------------------
                    End Select
                End If
            Else
                'NOP
            End If
        
        'Sinon recupere la valeur pour analyse ulterieure
        Case Else: Word = Word & Char
        End Select
    Next
    
    'That it ! Renvoi le resultat ! (En double precision)
    CalcEx = Value

Exit Function

Calc:
    'Si on dispose d'un operateur
    If Oprd = "" Then
        'Si le mot est un chiffre
        If IsNumeric(Word) Then
            'La valeur egale le mot
            Value = CDbl(Word)
        Else
            'L'operateur egale le mot
            If Len(Word) Then Oprd = UCase(Word)
        End If
        'Initialise le mot (buffer d'expression)
        Word = ""
    Else
        'Si le mot est numerique
        If IsNumeric(Word) Then
            'Calcule
            Select Case Oprd
            Case "+": Value = Value + CDbl(Word)
            Case "-": Value = Value - CDbl(Word)
            Case "*": Value = Value * CDbl(Word)
            Case "/": Value = Value / CDbl(Word)
            Case "\": Value = Value \ CDbl(Word)
            Case "^": Value = Value ^ CDbl(Word)
            '---------------------------------------
            'Extra fonction
            Case "MOD": Value = Value Mod CDbl(Word)
            Case "AND": Value = Value And CDbl(Word)
            Case "XOR": Value = Value Xor CDbl(Word)
            Case "OR": Value = Value Or CDbl(Word)
            '---------------------------------------
            End Select
            'Initialise l'operateur
            Oprd = ""
        Else
            'L'operateur prend la valeur du mot
            If Len(Word) Then Oprd = UCase(Word)
        End If
        'Initialise le mot
        Word = ""
    End If
Return

End Function
' ==== Utilisation :
' CalcEx("1 + 2 - 3")


Compatibilité : VB6, VBA

Disponible dans d'autres langages :

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.