Excel UDF接受范围和数组作为参数像“SUM”

我写了一个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!

那么我怎样才能修正上面的例子来接受范围呢?

如果你的内容是按项目对数组/范围进行求和,那么我只需要改一下For Each或者Ranges或者Arrays。

这是这个版本

 Public Function TSUM(numbers As Variant) As Variant Dim i As Variant For Each i In numbers TSUM = TSUM + i Next i End Function 

如果您通常要根据参数types来使用函数,则可以使用TypeName()和切换逻辑。 这是你用这种方法的function。 我称之为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之前)。 这允许它接受范围input。

如果采取第二种方法,一定要debugging并validation可能通过的TypeNames。