我正在编写一个需要接受数组和范围的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!
那么我如何修复上面的例子来接受范围?
答案 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。