工作表中的 Excel 数组函数很有用。例如,为了计算数组 A1:A5 的 sin 值的平均值,我输入了以下内容,效果很好:
{=AVERAGE(SIN(A1:A5))}
现在我想在 VBA 中创建一个完成该工作的函数,例如:
Function MyFunction(r As Variant) As Variant ' r is the range, e.g. A1:A5 as above
MyFunction = WorksheetFunction.Average(Sin(r))
End Function
此函数应产生单个值,但它不起作用(无论我在 Excel 单元格中将其作为普通公式或数组公式输入)。我认为问题可能是 VBA sin 函数与工作表 sin 函数不同,但用 WorksheetFunction.Sin 替换 sin 也不起作用。
当然,可以找出值的数量,编写一个循环将sin(r[i=1..n])
值存储在临时数组变量中,然后计算平均值,但我正在寻找更优雅、更高效的解决方案。
答案1
这里的问题是该Sin
函数需要一个值作为参数,而不是一个数组
请注意,VBA 函数Sin
与工作表函数不同Sin
(并且Sin
不是对象的成员WorkSheetFunction
,因此WorksheetFunction.Average(WorksheetFunction.Sin(r))
也不起作用)
如果你将 udf 更改为
Function MyFunction(r As Variant) As Variant ' r is the range, e.g. A1:A5 as above
MyFunction = WorksheetFunction.Average(r)
End Function
您将获得指定范围的平均值,这表明 udf 可以处理数组数据。
如果你正在寻找一种有效的方法,我的建议是尽可能坚持使用本机函数(数组或其他方式),作为对 udf 的调用,任何 udf,比本机函数慢得多。