VBA Worksheets.Calculate不使用Evaluate引用另一个工作表上的表达式

时间:2017-09-17 08:47:23

标签: vba excel-vba excel

我对VBA语句Worksheets.Calculate很感兴趣。在我看来,当函数引用同一工作簿中另一个工作表上的单元格时,使用Evaluate Statement的自定义函数无法正常工作。

在Sheet1上,我的列A只有普通数字。

同一工作簿中的Sheet2 C列在A列单元格上有基本表达式,如A1 + A2等。

我在VBA模块中有这个自定义功能

Function MyEval(Val1 As String)
    Application.Volatile
    MyEval = Evaluate(Val1)

End Function

我将这个公式=MyEval(Sheet2!C1)放在Sheet1中的B1中并将其向下拖动。 这是第一次正常工作。它接受Sheet2中的表达式:C1将其传递给MyVal,内部计算并返回结果。

问题是我在Sheet2中编辑字符串表达式时,整个公式返回0.我需要在Sheet1上按F9重新计算。

我已将Application.Volatile放入MyVal,将Worksheets("Sheet1").Calculate放入Sheet2中的工作表更改事件中。

仍然不起作用。使其工作的唯一方法是在Sheet1上按F9。

这是预期的行为吗?我错过了什么。当工作表更改事件并且公式引用另一个工作表上的范围时,如何使用Evaluate语句重新计算VBA中的自定义公式?

如果引用位于同一工作表中,则没有问题。它工作正常。我有Excel 2013.谢谢。

Screenshot

1 个答案:

答案 0 :(得分:2)

问题是您的代码正在调用Application.Evaluate,它在活动工作表的上下文中工作。如果您希望在功能所在的工作表的上下文中进行评估,则应使用worksheet.evaluate方法,如下所示:

Function MyEval(Val1 As String)
    Application.Volatile
    MyEval = Application.Caller.Worksheet.Evaluate(Val1)

End Function