Excel VBA:具有多功能性的无限范围输入(?)

时间:2013-05-23 17:40:36

标签: excel vba range user-defined-functions paramarray

有人可以帮我创建一个能够处理无限多种范围的功能吗?我在我的参数列表中尝试过“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)”?

谢谢,

利亚

2 个答案:

答案 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)

我认为您的方法存在两个问题

  • , (逗号和空格)是范围的UnionIntersect运算符
  • 要将多区域范围传递到单个参数,您需要将其括在( )

演示

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:D5C4:C6的交集是C5