gpt4 book ai didi

Excel VBA重复评估方法失败

转载 作者:行者123 更新时间:2023-12-04 21:05:15 25 4
gpt4 key购买 nike

我在 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 似乎试图评估integrate("t", "t", 2)

我怀疑问题出在第二次调用 Evaluate inside 集成,但我一直在兜圈子试图弄清楚。我知道 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

最佳答案

谢谢克里斯,你的 Debug.Print 建议让我思考,我把问题缩小了一点。似乎 Evaluate 被调用了两次,如下例所示:

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

从立即窗口运行:
?Evaluate("g()")
g
g
1

我找到了 http://www.decisionmodels.com/calcsecretsh.htm它通过使用 Worksheet.Evaluate 显示了一种解决方法(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 来绘制它。如果有人有任何其他建议,仍然很感兴趣。

关于Excel VBA重复评估方法失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23718381/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com