#c# #user-defined-functions #excel-dna
#c# #определяемые пользователем функции #excel-днк
Вопрос:
[ExcelFunction(Description = "Check if function was called as dynamic array or not")] public static bool IsDynamicArray() { //What goes in here? }
Я хотел бы знать ответ на этот вопрос, потому что функция, которую я использую, выполняет довольно большой поиск в базе данных, и поэтому, если она вызывается как устаревший массив, независимо от того, сколько элементов извлекается из базы данных, она будет отображать только количество выбранных ячеек.
Поэтому я хочу знать, была ли функция массива вызвана как устаревший массив, чтобы я мог сэкономить на таком большом поиске в базе данных и возвращать только количество элементов, необходимых для заполнения выбранных ячеек.
Ответ №1:
Функция не «вызывается как динамический массив или нет».
Способ использования результата массива зависит от того, поддерживает ли версия Excel функцию динамических массивов.
Если Excel поддерживает функцию динамических массивов, функция может быть вызвана из простой формулы или из CSE formuala. Вызывающая формула может также применять неявный оператор пересечения @-и просматривать только одно из значений. Или формула может обрабатывать результат массива с помощью таких функций , как SORT
или FILTER
, а затем использовать результаты дальше. Конечный результат может зависеть от всего массива, даже если он входит только в одну ячейку. Или (более обычно) он может пролиться в область листа правильного размера. И формула вызывающего региона может быть формулой массива CSE, поэтому приведенное ниже относится и к этой версии.
Если Excel не поддерживает функцию динамических массивов, функция может быть вызвана из одной ячейки или в виде формулы «Ctrl Shift Enter» (CSE) из области листа. Если это формула CSE, вызывающая область может быть больше, меньше или иметь правильный размер для массива.
Вы можете устранить неоднозначность в некоторых из этих случаев. Вы можете проверить, поддерживает ли версия Excel динамические массивы с помощью такого кода:
public static class UtilityFunctions { static bool? _supportsDynamicArrays; [ExcelFunction(IsHidden = true)] public static bool dnaSupportsDynamicArrays() { if (!_supportsDynamicArrays.HasValue) { try { var result = XlCall.Excel(614, new object[] { 1 }, new object[] { true }); _supportsDynamicArrays = true; } catch { _supportsDynamicArrays = false; } } return _supportsDynamicArrays.Value; } }
Если Excel не поддерживает динамические массивы, вы можете получить некоторую информацию о вызывающем абоненте, например:
var caller = XlCall.Excel(XlCall.xlfCaller) as ExcelReference;
Нет , если caller == null
функция не вызывается с рабочего листа. В противном случае вы можете проверить caller.RowFirst / RowLast / ColumnFirst / ColumnLast
, чтобы определить размер вызывающей области.
Существуют также способы получить формулу вызова из диапазона вызовов, но тогда вам все равно может потребоваться проанализировать формулу, чтобы выяснить, что происходит.
Комментарии:
1. Так что в принципе… ответ-Нет, я не могу определить, вызывается ли функция из простой формулы или формулы CSE?
2. С преддинамическими версиями массивов Excel, по крайней мере, вы можете получить диапазон вызовов. Иногда этого бывает достаточно.