VB - Оцінити математичний вираз рядка

Вступ

У VBA функція Evaluate приймає в якості аргументу формулу, задану в алфавітно-цифровій змінній, і повертає результат у алфавітно-цифрову змінну.

У VB ця функція відсутня, і ви повинні реалізувати її самостійно.

Ця демонстрація підтримує прості обчислення +, -, * та / та дужки.

Демо працює так само, як функція Evaluate.

Ця підкатегорія використовується лише для тестування.

 Sub TestCalcul () Дим A Як рядок Дим Ret As String A = "(((3 * (12.223+ 15)) - 7) * 21) / 7" Ret = Оцінювач (A) "Debug.Print Ret '= 224.007 A = "((123.32 / 2.67) * 6) +2127.34" Ret = Оцінювач (A) '= 2404.46359550562' Debug.Print Ret End Sub 

Код

 Функція Evaluer (ByVal Txt As String) Як рядок Дим i як ціле, oNB як ціле, fNB як ціле Dim P1 як ціле, P2 як ціле число Dim Buff Як рядок Розбийте T як рядок la virgule Txt = Замінити (Txt, ", ", ".") 'Записати (для i = 1 до Len (Txt), якщо Mid (Txt, i, 1) = "(" Тоді oNB = oNB + 1 Далі i 'S'il ya des ((ouvrantes), voir si elle sont validée par des) (fermantes) Якщо oNB> 0 Тоді для i = 1 До Len (Txt) Якщо Mid (Txt, i, 1) = ")" Тоді fNB = fNB + 1 Далі i Ще "Вихідні дані, Еквалайзер керування обчислень Evaluer = EvalueExpression (Txt) Вихід з функції Завершити Якщо ONB fNB Тоді 'Відновлення батьків не збігаються, повідомлення повідомляють про вихідні функції Якщо в той час як oNB> 0 ', то вибирається вищезазначений батьківський вираз P1 = InStrRev (Txt, "(") "Визначення батьківського вираження P2 = InStr (Mid (Txt, P1 + 1), ") ") Значення l Вираз 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 = Ліворуч (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) Кінцева функція функції EvalueExpression (A String) Як рядок Dim T як ціле, S як ціле Dim B як рядок, i як ціле, C як булеве Dim c1 як подвійне, c2 як подвійне, Signe як ціле R As String, Fin As Boolean, z As Integer 'enlever les espace A = Замінити (A, "", "") Хоча не Fin для i = 1 До Len (A) T = Asc (Mid (A, i, 1) )) Якщо T <48 і T 46 Або i = Len (A) Тоді, якщо C Тоді 'евалюта Якщо i = Len (A), то c2 = Val (Mid (A, S)) Else c2 = Val (Mid (A, S, i - S)) End Якщо R = Str (CalculSimple (c1, c2, Signe)) Якщо i = Len (A), то Fin = True Else A = Trim (R & Mid (A, i)) C = False Кінець, якщо Вихід для іншого 'sépare le 1er chiffre c1 = Val (Зліва (A, i - 1)) Signe = TS = i + 1 C = True End Якщо кінець, якщо далі i Wend' remplacer l'expression par le résultat EvalueExpression = Trim (R) End Функція 

Ви можете додати різні типи обчислень у нижченаведені функції:

 Функція CalculSimple (n1 як подвійний, n2 як подвійний, сигн як ціле число) як подвійний вибір 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 ... Функція End End End 
  • Примітка: Для того, щоб він повністю відповідав калькулятору, спочатку необхідно оцінити функцію * adn / і тільки тоді + і -.
  • Приклад 3 + 5 * 7
  • Обчислювач обробляє його наступним чином 5 * 7 = 35 + 3 = 38
  • Але з цією функцією: 3 + 5 = 8 * 7 = 56
  • Можна змінити "EvalueExpression" або ввести розрахунок як 3+ (5 * 7)

Попередня Стаття Наступна Стаття

Кращі Поради