我使用流行的自定义功能,我在互联网上找到一个vba博客。它读取文本单元格就好像它是公式(即" = A2 + B2"或" = ABS(A2 + B2)",我通过使用CONCATENATE函数创建它们,在工作簿中它们没有引号)。代码如下:
Function Eval(Ref As String)
Application.Volatile
Eval = Evaluate(Ref)
End Function
在我的工作簿中,我有多张完全相同的副本,除了2列数据,它们计算了一些描述性的统计数据(即总和,平均值,标准差等),公式在我的源表中,复制表有公式喜欢:Eval(sourceSheet!A1)和A1包含如上所述的公式文本。问题是在加载后应用宏,我需要预先刷新F9(有时几次)。它使用工作表中的数据刷新所有复制的工作表我很新鲜。例如:如果我在工作表3中刷新并且数据总和为5,则在所有其他工作表中将总和更改为5。我想我的代码以某种方式使函数应用于整个工作簿而不是像其他excel函数一样的单个工作表。
所以我有两个问题:
有没有办法更改代码,所以我的自定义函数只适用于我把它放入的工作表?
每次点击鼠标左键,你能给我发一个宏代码来刷新整个工作簿吗?
提前谢谢
答案 0 :(得分:2)
这是一个相当错误的UDF:评估总是将非限定引用作为引用活动工作表。 你真的需要使用Worksheet.Evaluate。尝试这样的假设Ref中的任何不合格的引用都是Ref所在的工作表
Function Eval(Ref As range)
Application.Volatile
Eval = ref.parent.Evaluate(Ref.value)
End Function
或者,如果您希望它引用正在调用UDF的工作表,请尝试使用
Function Eval(Ref As variant)
Application.Volatile
Eval = Application.Caller.Parent.Evaluate(Ref)
End Function
还有一些奇怪的事情/怪癖/错误评估你应该注意:看我的博客文章 https://fastexcel.wordpress.com/2011/11/02/evaluate-functions-and-formulas-fun-how-to-make-excels-evaluate-method-twice-as-fast/