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!
那么我如何修复上面的例子来接受范围呢?
如果您满足于按项目对数组/范围求和,我只需更改为使用适用于范围或数组的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.