使用VBA

时间:2018-12-24 04:28:47

标签: excel vba algorithm excel-vba parsing

我正在研究一个VBA脚本,该脚本正在解析用户输入字符串以供以后评估。我设法将其归结为以下内容,其中字母是包含字符串,数字或其他函数的变量,以便稍后进行评估。它们在尚未指定变量的AND / OR语句中进行比较,因此我不能只是提前对其进行评估。因此,我对此进行了简化:

( ( [$$FIELD_1] [$$REL_GREATER_THAN] [$$FUNC_ROUND_OPEN] 6000.25 
[$$FUNC_ROUND_CLOSE] AND [$$FIELD_1] [$$REL_LESS_THAN] [$$FUNC_ABS_OPEN] 
[$$FUNC_FLOOR_OPEN] - 7000.99 [$$FUNC_FLOOR_CLOSE] [$$FUNC_ABS_CLOSE] OR 
[$$FIELD_1] [$$REL_LESS_THAN] [$$FIELD_3] ^ 2 + 8 ) AND ( [$$STRING_1] & 
[$$STRING_2] & [$$STRING_3] [$$REL_NOT_EQUAL] [$$FIELD_5] & [$$STRING_4] & 
[$$FIELD_4] ) ) OR [$$FIELD_6] [$$REL_EQUAL] [$$STRING_5]

通过将布尔值替换为变量,然后将AND替换为乘法,或将OR替换为加法运算:

( ( A * B + C ) * ( D ) ) + E

我现在需要做的是利用代数的分布特性将其扩展。结果看起来像

A*B*D + C*D + E

然后我可以开始将值代入。

术语的顺序并不重要,只需将其分为乘法或加法即可。这个问题比我最初想的要困难得多,因为我需要它足够强大以处理其他方程式,而不仅仅是这个特定示例。

我一直在寻找VBA内置的可以自然完成此操作的东西,但是我还没有发现任何东西。这是一个类似的问题,但对于Java和C:Parse non standard form to standard form in java。不幸的是,那里的唯一答案基本上可以归结为“只是解析它”……这是我需要帮助的部分。

我如何以编程方式找出这些分布式扩展?有为此的算法吗?

1 个答案:

答案 0 :(得分:0)

假设您的方程式中包含一个字符串

equation = "( ( 2 * 3 + 2.5 ) * ( -2.5 ) ) + 1.9"

您可以Evaluate

MsgBox equation & " = " & Evaluate(Replace(equation, ",", "."))

Replace所在的位置,以确保将点作为小数点分隔符

这是一个有效的代码段,其中我使用了Dictionary来跟踪名称变量及其值:

Dim equation As String
equation = "( ( A * B + C ) * ( D ) ) + E"

Dim varDict As Scripting.Dictionary
Set varDict = New Scripting.Dictionary

With varDict
    .Add "A", 2#    ' assigning variable "A" the value 2.0
    .Add "B", 3     ' assigning variable "B" the value 3.0
    .Add "C", 2.5   ' assigning variable "C" the value 2.5
    .Add "D", -2.5  ' assigning variable "D" the value -2.5
    .Add "E", 1.9   ' assigning variable "E" the value 1.9
End With

Dim key As Variant
For Each key In varDict ' loop all variables
    equation = Replace(Replace(equation, key, varDict(key)), ",", ".") ' replace each variable name within 'equation' string with its corresponding value, and make sure you use dots for decimal separator
Next

MsgBox equation & " = " & Evaluate(equation) ' show the result