适用于范围和数组的 VBA 函数

问题描述 投票:0回答:1

我正在尝试编写一个 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 来获取上限,它会给出错误。有没有办法让一个函数在两种情况下都可以工作?

arrays vba range variant
1个回答
0
投票

啊哈!虽然

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
© www.soinside.com 2019 - 2024. All rights reserved.