Excel VBA重复评估方法失败

时间:2014-05-18 03:50:35

标签: excel-vba vba excel

我在VBA中编写了一个小工具,用于绘制一个函数,将其作为字符串传递(例如“1 /(1 + x)”或“exp(-x ^ 2)”)。我使用内置的Evaluate方法来解析公式。它的结尾是这个函数,它在给定值下评估某个变量的函数:

Function eval(func As String, variable As String, value As Double) As Double
  eval = Evaluate(Replace(func, variable, value))
End Function

这很好用,例如eval(“x ^ 2,”x“,2)= 4.我将它按元素顺序应用于x值数组以生成函数图。

现在我想启用我的工具来绘制函数的定积分。我创建了一个集成函数,它接受一个输入公式字符串,并使用Evaluate在各个点评估它并近似积分。我的实际集成函数使用了梯形规则,但为了简单起见,我们假设它是这样的:

Function integrate(func As String, variable As String, value As Double) As Double
  integrate = value * (eval(func, variable, 0) + eval(func, variable, value)) / 2
End Function

这也可以按预期工作,例如对于身份函数下的三角形区域,积分(“t”,“t”,2)= 2。

当我尝试通过图表例程运行集成时出现问题。当VBA遇到像这样的行

eval("integrate(""t"",""t"",x)", "x", 2)

然后在eval函数内调用Evaluate时,它将停止并且没有错误警告。 (内部引号必须加倍才能正确读取公式。)我希望得到值2,因为Evaluate似乎试图评估整合(“t”,“t”,2)

我怀疑问题出在第二次调用内部集成的Evaluate,但我一直在试图解决它。我知道评估是挑剔的,记录不清http://fastexcel.wordpress.com/2011/11/02/evaluate-functions-and-formulas-fun-how-to-make-excels-evaluate-method-twice-as-fast但是有人能想到这个方法吗?

由于 乔治

Excel 2010 V14,VBA 7.0

1 个答案:

答案 0 :(得分:0)

谢谢Chris,你的Debug.Print建议让我思考,我把问题缩小了一点。似乎评估被调用两次,如此示例所示:

Function g() As Variant
  Debug.Print "g"
  g = 1
End Function

从立即窗口运行:

?Evaluate("g()")
g
g
 1 

我发现这个http://www.decisionmodels.com/calcsecretsh.htm通过使用Worksheet.Evaluate显示了一种方法(评估实际上是Application.Evaluate的默认值):

?ActiveSheet.Evaluate("g()+0")
g
 1 

然而,这仍然无法解决Evaluate调用自身的问题。定义

Function f() As Variant
  Debug.Print "f"
  f = ActiveSheet.Evaluate("g()+0")
End Function

然后在立即窗口中:

?ActiveSheet.Evaluate("f()+0")
f
Error 2015

我找到的解决方案是为第二个公式评估定义了一个不同的函数:

Function eval2(formula As String) As Variant
  [A1] = "=" & formula
  eval2 = [A1]
End Function

这仍然使用Excel的内部评估机制,但通过工作表单元格计算。然后我得到了我想要的东西:

?eval2("f()")
f
g
 1

由于重复的工作表点击速度较慢,但​​这是我能做的最好的事情。所以在我的原始示例中,我使用eval来计算积分,并使用eval2来绘制它。如果有人有任何其他建议,仍然感兴趣。