0

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

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 语句,但我似乎无法弄清楚如何正确执行它。

任何帮助,将不胜感激!

4

1 回答 1

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 列宽的数组:

在此处输入图像描述

于 2016-10-21T19:51:07.280 回答