VBA - 错误数组Double作为函数参数

时间:2017-08-25 16:35:45

标签: excel vba

我正在尝试使用数组作为输入开发函数。但是,我收到#VALUE!错误。功能代码如下:

Function foo(x() As Double) As Double
    foo = x(1) + x(2)
End Function

使用以下公式完成调用:

=foo($E$8:$E$9)

E8和E9对应两个数字。

我的代码出了什么问题?

3 个答案:

答案 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