VB - Ocena matematycznego wyrażenia ciągu

Intro

W VBA funkcja oceny przyjmuje jako argument formułę określoną w zmiennej alfanumerycznej i zwraca wynik w zmiennej alfanumerycznej.

W VB tej funkcji brakuje i musisz ją zaimplementować samodzielnie.

To demo obsługuje proste obliczenia +, -, * i / oraz nawiasy.

Demo działa tak samo, jak funkcja Evaluate.

Ten sub jest używany tylko do testowania ..

 Sub TestCalcul () Dim A As String Dim Ret As String A = "(((3 * (12.223+ 15)) - 7) * 21) / 7" Ret = Evaluer (A) „Debug.Print Ret” = 224, 00 A = "((123, 32 / 2, 67) * 6) +2127, 34" Ret = Evaluer (A) '= 2404.46359550562 „Debug.Print Ret End Sub 

Kod

 Funkcja Evaluer (ByVal Txt As String) Jako ciąg Dim i jako liczba całkowita, oNB jako liczba całkowita, fNB jako liczba całkowita Dim P1 jako liczba całkowita, P2 jako liczba całkowita Dim Buff jako ciąg Dim T jako ciąg 'Wlać obliczenia y faut un point à la place de la virgule Txt = Zastąp (Txt, ", ", ".") 'Voir s'il ya des (dla i = 1 do Len (Txt) Jeśli Mid (Txt, i, 1) = "(" Wtedy oNB = oNB + 1 Dalej i 'S'il ya des ((ouvrantes), voir si elle sont validée par des) (fermantes) Jeśli oNB> 0 Then For i = 1 To Len (Txt) Jeśli Mid (Txt, i, 1) = ")" Następnie fNB = fNB + 1 Dalej i Else 'Pas de parenthèse, Evalue directement le calculator Evaluer = EvalueExpression (Txt) Wyjście Funkcja End If If oNB fNB Następnie' Les parenthèses ne sont pas concordantes, mettre message erreur parenthèse Exit Function End Jeśli while oNB> 0 'recherche la dernière parenthèse ouvrante P1 = InStrRev (Txt, "(")' Recherche la parenthèse fermante de l'expression P2 = InStr (Mid (Txt, P1 + 1), ")") 'Evalue l 'expression qui est entre parenthèses Buff = EvalueExpression (Mid (Txt, P1 + 1, P2 - 1)) 'Remplacer l'expression par le résultat et supprimer les parenthèses Txt = Left (Txt, P1 - 1) & Buff & Mid (Txt, P1 + P2 + 1) oNB = oNB - 1 Wend' plus de parenthèse, évaluer la dernière expression Evaluer = EvalueExpression (Txt) End Function Function EvalueExpression (A As String) As String Dim T jako Integer, S As Integer Dim B As String, i As Integer, C As Boolean Dim c1 As Double, c2 As Double, Signe As Integer Dim R As String, Fin As Boolean, z As Integer 'enlever les espace A = Zamień (A, "", "") Podczas gdy nie jest Fin Dla i = 1 Do Len (A) T = Asc (Mid (A, i, 1 )) Jeśli T <48 I T 46 Lub i = Len (A) Wtedy Jeśli C Wtedy 'évalue Jeśli i = Len (A) Następnie c2 = Val (Mid (A, S)) Else c2 = Val (Mid (A, S, i - S)) End Jeśli R = Str (CalculSimple (c1, c2, Signe)) Jeśli i = Len (A) Następnie Fin = True Else A = Trim (R i Mid (A, i)) C = False Koniec po wyjściu dla innej 'sépare le 1er szyfon c1 = Val (lewy (A, i - 1)) Signe = TS = i + 1 C = Prawdziwy koniec, jeśli koniec Jeśli dalej, zamierzam' remplacer l'wyrażenie par le résultat EvalueExpression = Trim (R) End Funkcja 

Możesz dodać różne typy obliczeń w poniższej funkcji:

 Funkcja CalculSimple (n1 jako Double, n2 jako Double, Signe jako Integer) jako Double Select Przypadek Signe Case 43 '+ CalculSimple = n1 + n2 Case 45' - CalculSimple = n1 - n2 Case 42 '* CalculSimple = n1 * n2 Case 47' / CalculSimple = n1 / n2 'Ici, ajouter d'autre calcul ... End Wybierz koniec funkcji 
  • Uwaga: Aby był całkowicie zgodny z kalkulatorem, musisz najpierw ocenić * adn / function, a dopiero potem + i - one.
  • Przykład 3 + 5 * 7
  • Kalkulator przetwarza go w następujący sposób 5 * 7 = 35 + 3 = 38
  • Ale z tą funkcją: 3 + 5 = 8 * 7 = 56
  • Możesz zmodyfikować „EvalueExpression” lub wprowadzić obliczenie jako 3+ (5 * 7)

Poprzedni Artykuł Następny Artykuł

Najważniejsze Wskazówki