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”的主要内容,如果未能解决你的问题,请参考以下文章