Excel VBA:将计算结果数组作为parameter passing给函数
我有一个接受数组的VBA函数,如果我通过一个引用如A1:A10
,它的工作效果很好。 它不接受诸如A1:A10+1
或A1:A10^2
类的“公式”参数,所得到的单元格包含#VALUE
。
许多Excel函数支持这一点,如linest(…),我可以写下面的公式来获得第四顺序,而不必手动列出X
参数的四列。
=LINEST( B1:B10, A1:A10^{1,2,3} )
我的函数声明是:
Function FFT(ByRef A) As Variant
我期待Excel评估expression式并将结果传递给函数。 这是Excel VBA不可能的吗?
如果您从另一个VBA子程序或函数调用您的函数,Excel将不会为您解释范围计算。 在调用函数之前,必须自己对范围区域执行任何数据操作。
但是,只要您将该函数用作工作表单元格中的UDF,则Excel将在您描述它们时解释范围参数。 在对范围进行任何计算时需要注意的是,您必须通过使用control-shift-enter
键来完成单元格公式,将单元格公式“标记”为数组公式。
考虑这个设置:
Option Explicit Public Function CalculateThis(inRange) As Double Dim answer As Double answer = 0# CalculateThis = answer End Function
范围参数A1:E1按照预期进入, Variant/Object/Range
。 使用VBA编辑器中的View – > Locals窗口来查看。
现在,如果你想在到达你的函数之前对范围进行计算,你仍然可以。
考虑公式=CalculateThis(A1:E1^2)
。 你所期望的是一组五个值,每个值的平方。 但是如果你input一个简单的enter
来input这个公式,你得到的是一个单一的值而不是一个数组。 (奖金指向谁可以解释为什么值为9的人)
但是input与control-shift-enter
相同的公式,就可以得到五个值的期望数组,每个值的平方。
如果你的范围和数组计算不匹配,你必须检查一些错误条件。 例如=CalculateThis(A1:E1^{1,2,3,4,5})
(使用control-shift-enter
)可以得到预期的结果:
但是=CalculateThis(A1:E1^{1,2,3})
不:
(变体数组中的错误是可以检查的string“错误2042”。)