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

Excel VBA Non-Contiguous Array User Defined Function Fix

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

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)" 我希望它忽略错误或空白参数,只为 [=25 创建一个连续数组=] 和 E1:E5.

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

如有任何帮助,我们将不胜感激!

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

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:$F+#N/A,$A:$A,$C:$C,$B:$B*#N/A)

returns 只有一个 2 列宽的数组: