我正在尝试使用数组作为输入开发函数。但是,我收到#VALUE!
错误。功能代码如下:
Function foo(x() As Double) As Double
foo = x(1) + x(2)
End Function
使用以下公式完成调用:
=foo($E$8:$E$9)
E8和E9对应两个数字。
我的代码出了什么问题?
答案 0 :(得分:4)
$E$8:$E$9
的类型为Range
,而不是Double
类型的数组。你的UDF失败了。
将参数类型更改为Range
后,只要您使用数值传递2X1(2Rows,1Column)范围,它就可以用于x(1) + x(2)
。
Function foo(rng As Range) As Double
foo = rng(1) + rng(2)
End Function
要制作有意义的UDF,您需要检查代码中范围的维度和数据类型。
答案 1 :(得分:0)
我建议使用变量作为参数:更高效,更不容易出错
Function foo(x As Variant) As Double
x=x.value2
foo = x(1, 1) + x(2, 1)
End Function
答案 2 :(得分:0)
我的解决方案是使用variant作为参数。它可以是array和Range。 测试它是否为单个单元格/值,将不会转换为数组。在这种情况下,返回单元格的值。 测试它是否是Range对象。如果是这种情况,请将其转换为数组。数组很快。
求和,我将遍历每个数组,以避免数组中索引的任何复杂化。 (一维或二维)。 另外,如果值是数字,则应进行测试。 小子用于测试来自子的函数调用。
Function foo(x As Variant) As Double
If VarType(x) < vbArray Then 'Single element
foo = IIf(IsNumeric(x), x, 0) ' if x is number return x else 0
Exit Function
End If
If TypeName(x) = "Range" Then x = x.Value2 ' if Range converts to array
Dim v As Variant
' sum all values of x
For Each v In x
'sum only numbers, ignor anything else
If IsNumeric(v) Then foo = foo + v
Next v
End Function
Sub testFoo()
'Test for non Range
Debug.Print foo(Array(1, 34, 5)) 'Test for array
Debug.Print foo(5.2) ' Test for a number
Debug.Print foo("Apple") ' Test for not number
End Sub
结果:
40; 5,2; 0