VB - Evalueer een wiskundige uitdrukking van een string

Intro

In VBA neemt de functie Evalueren als argument een formule op die is uiteengezet in een alfanumerieke variabele en retourneert het resultaat in een alfanumerieke variabele.

In VB ontbreekt deze functie en moet u deze zelf uitvoeren.

Deze demo ondersteunt eenvoudige berekeningen +, -, * en / en haakjes.

De demo werkt op dezelfde manier als de Evaluate-functie.

Deze sub wordt alleen gebruikt voor het testen van ..

 Sub TestCalcul () Dim A As String Dim Ret Als String A = "(((3 * (12.223+ 15)) - 7) * 21) / 7" Ret = Evaluer (A) 'Debug.Print Ret' = 224.007 A = "((123.32 / 2.67) * 6) +2127.34" Ret = Evaluer (A) '= 2404.46359550562' Debug.Print Ret End Sub 

De code

 Function Evaluer (ByVal Txt As String) As String Dim i As Integer, oNB As Integer, fNB As Integer Dim P1 As Integer, P2 As Integer Dim Buff As String Dim T As String 'Giet les berekent y faut un point à la place de la virgule Txt = Vervangen (Txt, ", ", ".") 'Voir s'il ya des (Voor i = 1 Aan Len (Txt) Als Mid (Txt, i, 1) = "(" Then oNB = oNB + 1 Volgende i 'S'il ya des ((ouvrantes), voir si elle sont validée par des) (fermantes) If oNB> 0 Then For i = 1 To Len (Txt) If Mid (Txt, i, 1) = ")" Vervolgens fNB = fNB + 1 Volgende i Anders "Pas de parenthèse, Evalue directement le calcul Evaluer = EvalueExpression (Txt) Exit Functie End If If oNB fNB Then 'Les parenthèses ne sont pas concordantes, mettre message erreur parenthèse Exit Functie End If 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) Eindfunctie Functie EvalueExpression (A als tekenreeks) Als tekenreeks Dim T Als integer, S als geheel dim B als tekenreeks, i als geheel getal, C als Booleaanse dim c1 als dubbel, c2 als dubbel, teken als geheel dimmen R As String, Fin As Boolean, z As Integer 'enleverles les espace A = Replace (A, "", "") While Not Fin For i = 1 Aan Len (A) T = Asc (Mid (A, i, 1 )) Als T <48 en T 46 of i = Len (A) Dan als C Dan 'evalue als i = Len (A) Dan c2 = Val (Mid (A, S)) Anders c2 = Val (Mid (A, S, i - S)) End If R = Str (CalculSimple (c1, c2, Signe)) If i = Len (A) Dan Fin = True Else A = Trim (R & Mid (A, i)) C = False End If Exit For else 'sépare le 1er chiffre c1 = Val (Left (A, i - 1)) Signe = TS = i + 1 C = True End If End If Next i Wend' remplacer l'expression par le résultat EvalueExpression = Trim (R) einde functie 

U kunt verschillende soorten berekeningen toevoegen in de onderstaande functie:

 Functie CalculSimple (n1 als Double, n2 als Double, Signe As Integer) als Double Select Case 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 ... Einde selecteren Eindfunctie 
  • Opmerking: om volledig in overeenstemming te zijn met een rekenmachine, moet u eerst de * adn / functie en dan pas de + en - waarden evalueren.
  • Voorbeeld 3 + 5 * 7
  • Een rekenmachine verwerkt het als volgt 5 * 7 = 35 + 3 = 38
  • Maar met deze functie: 3 + 5 = 8 * 7 = 56
  • U kunt de "EvalueExpression" wijzigen of de berekening invoeren als 3+ (5 * 7)

Vorige Artikel Volgende Artikel

Top Tips