我正在研究一个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。不幸的是,那里的唯一答案基本上可以归结为“只是解析它”……这是我需要帮助的部分。
我如何以编程方式找出这些分布式扩展?有为此的算法吗?
答案 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