0

有人可以帮我创建一个可以处理无限数量的不同范围的函数吗?我在参数列表中尝试过“Paramarray variables() as Variant”和“variable as Range”,但它们都没有提供我正在寻找的多功能性。

关键是我希望我的函数能够同时处理诸如“MyFunc(A1:A10, B1)”或“MyFunc(A1, B1:10, C11)”之类的事情。我发现的问题是“ParamArray”只能处理逗号分隔的输入,而“变量作为范围”只能处理非逗号分隔的输入。

基本上,我希望拥有与 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)”的函数吗?

谢谢,

埃利亚斯

4

2 回答 2

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] 这也不是问题,双循环不会有问题。

于 2013-09-26T23:22:56.320 回答
0

我认为你的方法有两个问题

  • ,and  (comma and space) 是范围的UnionandIntersect运算符
  • 要将多区域范围传递给单个参数,您需要将其括在( )

展示

ParamArrayversion
循环遍历数组变量以访问各个范围

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:C6C5

于 2013-05-24T08:17:41.210 回答