Я не знаком с ключевым словом async (это зависит от Silverlight или новой функции в бета-версии Visual Studio?), но я думаю, что могу дать вам представление о том, почему вы не можете этого сделать.
Если я это сделаю:
var o = new MyObject();
MessageBox(o.SomeProperty.ToString());
o не может быть инициализирован до следующей строки кода. Невозможно назначить экземпляр вашего объекта до тех пор, пока ваш конструктор не будет завершен, и создание асинхронного конструктора не изменится, так что будет точкой? Тем не менее, вы можете вызвать асинхронный метод из своего конструктора, а затем ваш конструктор может завершиться, и вы получите свой экземпляр, в то время как метод async все еще делает все, что ему нужно для настройки вашего объекта.
В общем, вы не можете сделать это. VBA прекрасно справляется с вложенными массивами в качестве значений, а Excel - нет. Это имеет смысл, потому что Excel в конечном итоге должен рассматривать любые значения, которые он получает от ваших UDF, как вещи, которые могут попасть в сетку рабочего листа.
Было бы неплохо, если бы промежуточные результаты не должны были подчиняться этому ограничению. В вашем примере выше вы не пытаетесь поместить зубчатый массив в какие-либо ячейки; вы просто хотите создать его и передать в 'TEST1'. К сожалению, Excel так не работает. Он оценивает каждое выражение в формуле в легальное значение Excel, а #VALUE! - это универсальное значение для "не легального значения". (Есть и другие ограничения на возвращаемые массивы, помимо неровности. Например, массивы более определенного размера также приводят к ошибке #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)))
приведет к передаче в TEST1 двумерного массива, а не одномерного массива одномерных массивов.
Возможно, вам также будет полезен этот вопрос и мой ответ на него:
Возврат заданного пользователем типа данных в ячейку Excel
ПОСЛЕДНЯЯ СПРАВКА:
Кстати, ваша функция 'ARY' могла бы быть намного короче. Это не имеет отношения к вашему первоначальному вопросу, но стоит упомянуть:
Public Function arr(ParamArray args())
arr = args
End Function
Пример ее использования есть в этом ответе: