Excel VBA非连续数组用户定义函数修复

时间:2016-10-21 19:36:26

标签: arrays excel vba udf contiguous

我有一个用户定义的函数,如下所示,它允许我将两个不相邻的列组合成一个连续的数组。

Function MakeContig(ParamArray av() As Variant) As Variant
    Dim avOut() As Variant
    Dim i       As Long
    Dim j       As Long

    ReDim avOut(1 To av(0).Count, 0 To UBound(av))
    For j = 0 To UBound(av)
        For i = 1 To av(j).Rows.Count
            avOut(i, j) = av(j)(i)
        Next i
    Next j
    MakeContig = avOut
End Function

因此,如果我在单元格中键入“= makecontig(A1:A5,E1:E5)”,则会形成由公式中包含的两列组成的单个数组。我希望能够编辑这个函数,以便它忽略一个充满错误或任何类型的非数组条目的数组的条目。

例如,如果我输入“= makecontig(A1:A5,E1:E5 ,,)”或“= makecontig(A1:A5,Nothing,E1:E5)”或“= makecontig(A1:A5,E1) :E5,C1:C5 * #N / A)“我希望它忽略错误或空白参数,只为A1创建一个连续的数组:A5和E1:E5。

我想我需要在UDF中的某处包含一个If / Then语句,但我似乎无法弄清楚如何正确执行它。

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

您需要测试参数是否为范围:

Function MakeContig(ParamArray av() As Variant) As Variant
    Dim avOut() As Variant
    Dim i       As Long
    Dim j       As Long
    Dim x As Long
    Dim t As Long
    x = -1
    For j = 0 To UBound(av)
        If TypeName(av(j)) = "Range" Then
            x = x + 1
            If av(j).Count > t Then
                t = av(j).Count
            End If
        End If
    Next j
    ReDim avOut(1 To t, 0 To x)
    t = 0
    For j = 0 To UBound(av)
        If TypeName(av(j)) = "Range" Then
        For i = 1 To av(j).Rows.Count
            avOut(i, t) = av(j)(i)
        Next i
        t = t + 1
        End If
    Next j
    MakeContig = avOut
End Function

如你所见:

MakeContig($F$1:$F$8+#N/A,$A$1:$A$26,$C$1:$C$26,$B$1:$B$4*#N/A)

只返回一个2列宽的数组:

enter image description here