Исправление определяемой пользователем функции несмежного массива в Excel VBA

У меня есть определенная пользователем функция, как показано ниже, которая позволяет мне объединить два несмежных столбца в непрерывный массив.

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.

Я предполагаю, что мне нужно включить оператор If/Then где-то в UDF, но я не могу понять, как его правильно выполнить.

Любая помощь будет оценена по достоинству!


person Shawn    schedule 21.10.2016    source источник


Ответы (1)


Вам нужно проверить, является ли параметр диапазоном или нет:

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 столбцов:

введите описание изображения здесь

person Scott Craner    schedule 21.10.2016
comment
Потрясающий! Очень ценю это - person Shawn; 24.10.2016