Excel VBA:将计算结果数组作为parameter passing给函数

我有一个接受数组的VBA函数,如果我通过一个引用如A1:A10 ,它的工作效果很好。 它不接受诸如A1:A10+1A1: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”。)