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")
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.