我对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.谢谢。
答案 0 :(得分:2)
问题是您的代码正在调用Application.Evaluate
,它在活动工作表的上下文中工作。如果您希望在功能所在的工作表的上下文中进行评估,则应使用worksheet.evaluate
方法,如下所示:
Function MyEval(Val1 As String)
Application.Volatile
MyEval = Application.Caller.Worksheet.Evaluate(Val1)
End Function