Excel UDF同时接受Range和Array作为参数,如' SUM'

时间:2015-04-09 15:09:51

标签: arrays excel excel-vba vba

我正在编写一个需要接受数组和范围的UDF。

通常将参数声明为variant会起作用,但Range是一个对象,因此不再适用。如下所述,我粘贴的代码仅在传递数组时才有效 这是基于SUM的理论示例:

Function TSUM(numbers() As Variant) As Variant
    Dim i As Integer
    For i = 1 To UBound(numbers, 1)
        TSUM = TSUM + numbers(i)
    Next i
End Function
  

= TSUM({1,1})返回2
  = TSUM(A1:B1)返回#VALUE!

那么我如何修复上面的例子来接受范围?

1 个答案:

答案 0 :(得分:5)

如果您满足于逐项对数组/范围求和,我只需更改为使用适用于范围或数组的For Each循环。

这是该版本

Public Function TSUM(numbers As Variant) As Variant
    Dim i As Variant

    For Each i In numbers
        TSUM = TSUM + i
    Next i
End Function

如果您通常希望根据参数的类型处理函数,则可以使用TypeName()和切换逻辑。这是你用这种方法运作的。我称它为TSUM2的唯一性。

Public Function TSUM2(numbers As Variant) As Variant
    Dim i As Integer

    If TypeName(numbers) = "Range" Then
        TSUM2 = Application.WorksheetFunction.Sum(numbers)
    Else
        For i = 1 To UBound(numbers, 1)
            TSUM2 = TSUM2 + numbers(i)
        Next i
    End If
End Function

请注意,在这两个示例中,我从数字参数中删除了括号(之前为numbers() as Variant)。这允许它接受范围输入。

如果采用第二种方法,请务必调试并验证可能出现的TypeNames。