有人可以帮我创建一个能够处理无限多种范围的功能吗?我在我的参数列表中尝试过“Paramarray variables()as Variant”和“variable as Range”,但它们都没有提供我正在寻找的多功能性。
关键是我希望我的功能能够同时处理诸如“MyFunc(A1:A10,B1)”或“MyFunc(A1,B1:10,C11)”之类的东西。我发现的问题是“ParamArray”只能处理逗号分隔的输入,而“作为Range的变量”只能处理非逗号分隔的输入。
基本上,我想拥有与SUM()函数相同的功能。 SUM可以处理无限(种类)数量的输入,无论它们是用逗号分隔还是在范围内。
根据要求,这是我的代码:
Function COMMA_DELIMITER(inputs as Range)
' this function basically concatenates a consecutive set of cells and places commas between values
For Each j in Inputs
stringy = stringy & j.value & chr(44)
Next
stringy = Left(stringy, Len(stringy) - 1)
COMMA_DELIMITER = stringy
End Function
或
Function COMMA_DELIMITER_A(ParamArray others())
'this is the same function, only the cells don't have to be consecutive
For i = 1 to UBound(others) + 1
stringy = stringy & others(i-1) & chr(44)
Next
COMMA_DELIMIERTER_A = Left(stringy, Len(stringy) - 1)
End Function
我非常想创建一个能够灵活处理连续单元和/或非连续单元的函数。输入看起来像这样,“= MyFunc(A1,B1:B10,C11,D12:D44)”。
有人可以帮我创建一个可以处理这样的事情的函数,“MyFunc(A1,B1:B10,C11,D12:D44)”?
谢谢,
利亚
答案 0 :(得分:1)
实际上可以这样做,来自chris neilsen的代码几乎就在那里。
Function MyFunc1(ParamArray r()) As Variant
Dim rng As Range
Dim i As Long
Dim j As Variant
Dim s As String
For i = LBound(r) To UBound(r)
For each j in r(i)
s = s & " " & j.Address
Next
Next
MyFunc1 = s
End Function
请参阅?你只需要再放一个循环,所以如果你有一个像[A1:A4]这样的范围,它也会循环进去。一个循环将返回另一个ParamArray,因此您必须循环两次。如果你只有[A1]这也不是问题,那么双循环将不会造成任何问题。
答案 1 :(得分:0)
我认为您的方法存在两个问题
,
和
(逗号和空格)是范围的Union
和Intersect
运算符( )
演示
ParamArray
版本
循环遍历数组变量以访问各个范围
Function MyFunc1(ParamArray r()) As Variant
Dim rng As Range
Dim i As Long
Dim s As String
For i = LBound(r) To UBound(r)
s = s & " " & r(i).Address
Next
MyFunc1 = s
End Function
Range
版本
迭代范围Areas
集合以访问各个范围
Function MyFunc2(r As Range) As Variant
Dim rng As Range
Dim i As Long
Dim s As String
For Each rng In r.Areas
s = s & " " & rng.Address
Next
MyFunc2 = s
End Function
两者
=MyFunc1(B5:D5 C4:C6,B10:E10,D13:D16)
和
=MyFunc2((B5:D5 C4:C6,B10:E10,D13:D16))
将返回
$C$5 $B$10:$E$10 $D$13:$D$16
(请注意B5:D5
和C4:C6
的交集是C5
)