我花了几个小时在这上面并找到了相关的问题,但我没有找到一个可行的答案,所以我不认为这是重复的。
我在一个单元格中有一个字符串,它代表一个简单的公式和一个变量。该变量将被预定义。然后我需要评估该字符串。我无法获取要评估的单元格值。字符串本身在即时窗口中评估,但完全相同的单元格值字符串不会:
?myVar
1
?[M115].Value
"0.1*" & myVar & "*(0.2+0.3*" & myVar & "/.4)"
?Evaluate("0.1*" & myVar & "*(0.2+0.3*" & myVar & "/.4)")
0.095
?Evaluate([M115].Value)
Error 2029
我对变量的最佳猜测是没有进行评估,因为我可以将 myVar 替换为 1,并且它可以工作。我尝试了各种三重引号,但都不起作用。我该如何完成这个看似简单的事情?我尝试过像这样包装子程序和函数:
Function ev(r As Range, ByVal myVar As Double) As Variant
Debug.Print myVar
Debug.Print r.value
ev = Evaluate(r.value)
End Function
?ev([M115], 1)
1
"0.1*" & myVar & "*(0.2+0.3*" & myVar & "/.4)"
Error 2029
myVar=1
?Evaluate("0.1*" & myVar & "*(0.2+0.3*" & myVar & "/.4)")
0.095
我忽略了什么?谢谢。
答案1
尝试此解决方案,如果它对您有用,请恢复。按 ALT + F11 打开 VBA 编辑器。插入模块并将以下 UDF 粘贴到其中。
Public Function test(r As Range, myvar As Double) As Double
Z = r.Formula
Z = Replace(Z, "myvar", myvar)
test = Evaluate(Z)
End Function
现在,Excel 单元格中的表达式不应包含任何不属于公式的字符,如 & " 等。它应该包含具有静态名称的简单公式,并始终保持名称不变且区分大小写。
例如 myvar + 3 此处 myvar 只是静态文本,未在任何地方声明。使用该函数并将单元格作为范围传递,将变量值作为双精度传递给它。没有进行太多验证,传递多维数组可能会导致此处出现错误。参见下面的屏幕截图。尝试一下并检查这是否符合您的要求。
答案2
我在超级用户上没有足够的信用来点赞,我今天才链接了我的 stackoverflow 帐户。但是,那个答案足够接近,可以摆脱困境。以下是有效的方法:
Public Function evtest(r As Range, myVar As Double) As Variant
Dim z As Variant
z = r.formula
z = Replace(z, "myVar", myVar)
Debug.Print z
evtest = Evaluate(z)
End Function
现在我觉得我有事可做了
?[M113].Value
0.1*myVar*(0.2+0.3*myVar/.4)
?evtest([M113], 1)
0.1*1*(0.2+0.3*1/.4)
0.095
如果我发现需要修改的地方,我会更新此答案。非常感谢。
编辑:我让它更加通用一些:
Function evtest(r As Range, myVarName As String, myVarValue As Double) As Variant
Dim z As Variant
z = r.formula
z = Replace(z, myVarName, myVarValue)
Debug.Print z
evtest = Evaluate(z)
End Function
现在像这样使用:
?[M113].Value
0.1*myVar*(0.2+0.3*myVar/.4)
?TEST.evtest([M113], "myVar", 1.5)
0.1*1.5*(0.2+0.3*1.5/.4)
0.19875
希望这对其他人有帮助。