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

Posted

技术标签:

【中文标题】Excel UDF 接受范围和数组作为参数,如“SUM”【英文标题】:Excel UDF that accepts both Range and Array as Parameter like 'SUM' 【发布时间】:2015-04-09 15:09:51 【问题描述】:

我正在编写一个需要同时接受数组和范围的 UDF。

通常将参数声明为变体会起作用,但 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!

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

【问题讨论】:

【参考方案1】:

如果您满足于逐项对数组/范围求和,我会改为使用适用于范围或数组的 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)。这允许它接受范围输入。

如果您采用第二种方法,请务必调试并验证可能通过的 TypeName。

【讨论】:

如果您使用单个参数,这可以正常工作,但如果该函数需要多个参数,则您需要在 for 循环中保留一个计数器以访问每个范围的第 N 个元素/ 数组,这有点棘手 @AndreTerra,您指的是ParamArray 还是简单的带有多个参数的UDF? @ByronWall 我的意思是一个带有多个参数的 UDF,但我的评论不正确。我想我没有阅读第二个 sn-p 的评论,它有一个循环计数器,可用于访问 @987654326 @ 回到这个答案(并看到我几年前的评论!),我确实发现问题的措辞方式并不理想,因为它不需要答案处理编写可以处理数组或范围的逻辑的需要。如果Application.WorksheetFunction.Sum() 不存在,您是否会简单地在TypeName 检查中复制您的代码并使用Range.Cells 处理它?我发现对于复杂的公式,这很快就会变得重复、容易出错或不灵活。我只想写一个 MyUDF(foo) 并在工作簿和 VBA 中使用它..

以上是关于Excel UDF 接受范围和数组作为参数,如“SUM”的主要内容,如果未能解决你的问题,请参考以下文章

Spark UDF 作为函数参数,UDF 不在函数范围内

Excel UDF 过滤器范围

Excel UDF 对变量工作表的范围求和

如何将 Excel 数组公式传递给 VBA UDF?

Excel VBA:将计算结果数组作为参数传递给函数

将多维数组传递到 VBA 中的 Excel UDF