我怎样才能把范围,单个单元格和/或直接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