我怎样才能把范围,单个单元格和/或直接input到ParamArray数组?

我正在尝试构build一个UDF,它将接受一个ParamArray,它将接受一个单元格,一个单元格范围和/或一个直接值。 我需要通过ParamArray循环来获取所有的值,但是当我尝试ReDim数组时,它会卡住,循环结束。 我只是做这个完全错误的,因为这似乎太多的工作。

Function myudf(first As Variant, ParamArray args() As Variant) Dim i, j As Long Dim argsarray() As Variant ReDim argsarray(0, 0) For i = 0 To UBound(args) If Not IsObject(args(i)) Then ReDim Preserve argsarray(0 To UBound(argsarray) + 1) argsarray(i) = args(i) ' Handle explicitly passed arguments, eg "1,goonie,etc") ElseIf IsArray(args(i).Value2) Then For j = 1 To UBound(args(i).Value2) ReDim Preserve argsarray(0 To UBound(argsarray) + 1) argsarray(UBound(argsarray) + 1) = args(j).Value2 ' Handle a range of cells, eg A1:A3 Next j Else ReDim Preserve argsarray(0 To UBound(argsarray) + 1) argsarray(i) = args(i).Value2 ' Handle individual cells, eg A1) End If Next i myudf = Join(argsarray, ",") End Function 

你有两个dimmentsion数组ReDim argsarray(0, 0)

从MSDN跟进:

如果使用Preserve ,则只能调整数组的最后一个维度 。 对于其他维度,您必须指定现有数组的边界。

所以,这不起作用ReDim Preserve argsarray(0 To UBound(argsarray) + 1) ,但是这个工程ReDim Preserve argsarray(0, 0 To UBound(argsarray) + 1)

顺便说一下, Preserve是非常昂贵的操作。 我build议您查看您的代码,并在计算所有单元格后使用单个ReDim argsarray

试试这个:

 Function myudf(first As Variant, ParamArray args() As Variant) Dim i As Long, cnt As Long Dim argsarray() As Variant Dim c, rng For Each rng In args If IsObject(rng) Then cnt = cnt + rng.Cells.Count ElseIf IsArray(rng) Then cnt = cnt + UBound(rng) Else cnt = cnt + 1 End If Next ReDim argsarray(1 To cnt) i = 1 For Each rng In args If IsObject(rng) Or IsArray(rng) Then For Each c In rng argsarray(i) = c i = i + 1 Next Else argsarray(i) = rng i = i + 1 End If Next myudf = Join(argsarray, ",") End Function 

如果UDF的目的只是连接值,那么也可以使用这个值:

 Function myudf2(first As Variant, ParamArray args() As Variant) Dim c, rng For Each rng In args If IsObject(rng) Or IsArray(rng) Then For Each c In rng myudf2 = myudf2 & c & "," Next Else myudf2 = myudf2 & rng & "," End If Next myudf2 = Left(myudf2, Len(myudf2) - 1) End Function