Передача многомерного массива в Excel UDF в VBA - PullRequest
1 голос
/ 07 августа 2010

Как передать многомерные массивы или вложенные массивы в UDF Excel, которые позволяют ссылаться на другие диапазоны?

У меня есть UDF, определенный как "ARY", который выполняет то же, что Array () в VBA, но вфункция рабочего листа.

Это позволяет мне иметь формулу рабочего листа, такую ​​как

= TEST1 (ARY (ARY ("A", "B"), "C"))
или
= TEST1 (ARY (ARY (A1, B1), C1)

Однако при выполнении TEST1 в качестве функции листа я получаю ошибку 2015. Если я выполняю TEST1 из VBA, она работает нормально и возвращает "A ".

Public Function TEST1(Params As Variant) As Variant
    TEST1 = Params(0)(0)
End Function

'Returns 1D ARRAY
Public Function ARY(ParamArray Params() As Variant)
    ReDim result(0 To UBound(Params)) As Variant
    Dim nextIndex As Integer
    Dim p As Variant

    nextIndex = 0

    For Each p In Params
        result(nextIndex) = p
        nextIndex = nextIndex + 1
    Next

    ARY = result
End Function

1 Ответ

2 голосов
/ 07 августа 2010

В общем, вы не можете этого сделать. VBA подходит для вложенных массивов в качестве значений, но Excel просто нет. Это имеет смысл, поскольку в конечном итоге Excel должен обрабатывать любые значения, которые он получает от ваших пользовательских функций, как вещи, которые могут попасть в сетку рабочего листа.

Было бы хорошо, если бы промежуточные результаты не подчинялись этому ограничению. В приведенном выше примере вы не пытаетесь поместить неровный массив в какие-либо ячейки; Вы просто хотите создать его и передать в 'TEST1'. К сожалению, Excel просто не работает таким образом. Каждое выражение в формуле оценивается как допустимое значение Excel и #VALUE! является универсальным для "не законной стоимости". (Существуют и другие ограничения для возвращаемых массивов, кроме зубчатости. Например, массивы определенного размера также приводят к ошибке # ЗНАЧ!!)

Обратите внимание, что вложенные массивы одинаковой длины могут передаваться обратно из UDF:

Public Function thisKindOfNestingWorks()
    thisKindOfNestingWorks = Array(Array(1, 2), Array(3, 4))
End Function

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

Итак, вызов функции ARY, описанной выше, должен работать нормально:

=ARY(ARY(A1, B1), ARY(C1, D1))

Однако ваша функция TEST1 не будет выполнена, так как вызов

=TEST1(ARY(ARY(A1, B1), ARY(C1, D1)))

приведет к передаче 2-D массива в TEST1, а не 1-D массива из 1-D массивов.

Вам также может пригодиться этот вопрос и мой ответ на него:

Возвращает пользовательский тип данных в ячейку Excel

МНОГО ПОСЛЕДНЕГО РЕДАКТИРОВАНИЯ:

Кстати, ваша функция 'ARY' может быть намного короче. Это не имеет ничего общего с вашим первоначальным вопросом, но стоит упомянуть:

Public Function arr(ParamArray args())
     arr = args
End Function

В этом ответе есть пример использования:

Excel Выберите регистр?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...