Передача многомерного массива в Excel UDF в VBA

Я не знаком с ключевым словом async (это зависит от Silverlight или новой функции в бета-версии Visual Studio?), но я думаю, что могу дать вам представление о том, почему вы не можете этого сделать.

Если я это сделаю:

var o = new MyObject();
MessageBox(o.SomeProperty.ToString());

o не может быть инициализирован до следующей строки кода. Невозможно назначить экземпляр вашего объекта до тех пор, пока ваш конструктор не будет завершен, и создание асинхронного конструктора не изменится, так что будет точкой? Тем не менее, вы можете вызвать асинхронный метод из своего конструктора, а затем ваш конструктор может завершиться, и вы получите свой экземпляр, в то время как метод async все еще делает все, что ему нужно для настройки вашего объекта.

1
задан Christopher Tso 7 August 2010 в 01:36
поделиться

1 ответ

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

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

Excel Select Case?

2
ответ дан 2 September 2019 в 22:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: