В общем, вы не можете этого сделать. 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 Выберите регистр?