Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
excelvba重复评估法的失效_Excel_Vba - Fatal编程技术网

excelvba重复评估法的失效

excelvba重复评估法的失效,excel,vba,Excel,Vba,我用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 这

我用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表示恒等式函数下三角形的面积

当我试图在绘图例程中运行integrate时,问题就出现了

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

我怀疑问题出在第二次调用Evaluate inside integrate上,但我一直在周而复始地试图找出答案。我知道Evaluate很挑剔,而且文档记录也很差,但有人能想出一种方法来解决这个问题吗

谢谢 乔治


Excel 2010 V14,VBA 7.0

谢谢Chris,您的调试。打印建议让我思考了一下,我把问题缩小了一点。看起来Evaluate调用了两次,如本例所示:

Function g() As Variant
  Debug.Print "g"
  g = 1
End Function
从即时窗口运行:

?Evaluate("g()")
g
g
 1 
?ActiveSheet.Evaluate("f()+0")
f
Error 2015
我发现了这一点,它通过使用工作表.Evaluate(Evaluate实际上是Application.Evaluate的默认值)显示了解决这一问题的方法:

但是,这仍然不能解决Evaluate调用本身的问题

Function f() As Variant
  Debug.Print "f"
  f = ActiveSheet.Evaluate("g()+0")
End Function
然后在即时窗口中:

?Evaluate("g()")
g
g
 1 
?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绘制图表。如果有人有任何其他建议,我仍然感兴趣。

您面临的一个问题是函数的返回
类型
。如您提供的链接中所述,
Evaluate
可能会返回一个错误,因此应该分配给一个
变量。我做了这个mod,添加了一些诊断
调试。打印
,并运行您的示例。在返回错误之前,该代码似乎会导致意外的递归。对此我无法提供任何解释。