我正在尝试编写一个 UDF,它从用户处获取范围或数组并对其进行迭代。如果我将其声明为一个范围,如下所示:
Function Test(param As Range) As Variant
Dim total As Integer
Dim cell As Range
total = 0
For Each cell In param
total = total + cell.Value2
Next
Test = total
End Function
当像
=TEST(C22:C24)
那样调用时它工作正常,但当像=TEST({1,2,3,4})
那样调用时会出错。另一方面,如果我将其声明为变体,如下所示:
Function Test(param As Variant) As Variant
Dim i As Integer, total As Integer
total = 0
On Error GoTo endfunc
For i = 1 To 100
total = total + param(i)
Next
endfunc:
Test = total
End Function
当像
=TEST({1,2,3,4})
那样调用时它工作得很好,但是当像=TEST(C22:C24)
那样调用时它会继续超出我给它的范围的末尾(这就是为什么我给它的上限为100)。我无法在变体上使用 UBound 来获取上限,它会给出错误。有没有办法让一个函数在两种情况下都可以工作?
啊哈!虽然
VarType(param)
在两种情况下都给出 8204
,但 TypeName(param)
在第一种情况下给出 Range
,在第二种情况下给出 Variant()
。使用这个我发现的解决方案是
Function Test(param As Variant) As Variant
Dim total As Integer
total = 0
If TypeName(param) = "Range" Then
Dim cell As Range
For Each cell In param
total = total + cell
Next
Else
Dim i As Integer
For i = 1 To UBound(param)
total = total + param(i)
Next
End If
Test = total
End Function