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

sgp*_*667 2 arrays excel vba excel-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
Run Code Online (Sandbox Code Playgroud)

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

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

Byr*_*all 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
Run Code Online (Sandbox Code Playgroud)

如果您通常希望根据参数的类型处理函数,则可以使用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
Run Code Online (Sandbox Code Playgroud)

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

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