Это довольно открытый вопрос, и, в отсутствие исходного кода, он должен основываться на эмпирических данных с использованием доступных инструментов формул, а также документации ECMA / ODF.
Что такое оценка массива изачем нам это нужно?
Стандарт открытых формул описывает здесь общую модель обработки формул: http://docs.oasis -open.org / office / v1.2 / os / OpenDocument-v1.2-os-part2.html #__ RefHeading__1017860_715980110
Возьмем в качестве простого примера следующую формулу, где функция ABS
, как и многие другие, принимает и возвращает числовые значения:
=SUM(ABS(A1:A3))
При нормальном вводе аргументы значения разрешаются путем пересечения с той же строкой или столбцом, что и ячейка формулы.Таким образом, если введено в B2
, то приведенное выше разрешится в ABS(A2)
.
С другой стороны, если вводить в виде формулы массива с помощью Ctrl + Shift + Enter, фигурные скобки {.}
помещаются вокруг формулы,и аргумент SUM
равен вычисленному массиву , возвращающему результат, равный:
=ABS(A1)+ABS(A2)+ABS(A3)
Оценка массива такого типа может быть очень полезна для сокращения промежуточноговычисления, а также сокращение длины формулы.
Однако некоторые функции, такие как INDEX
, VLOOKUP
, HLOOKUP
, CELL
, FILTERXML
и HYPERLINK
, могут возвращать массивы.Как указано выше в ссылке OpenFormula, такие функции не выполняют итерации по значениям аргументов так же, как ABS.Для принудительного создания массива с этими функциями необходимы приемы, описанные в следующем разделе.
Как N(IF(.))
и N(INDEX(.))
работают за кадром?
Учтите этопара формул (например, если C1:C3 = {2;5;7}
результат =A2+A5+A7
):
=SUM(INDEX(A:A,N(INDEX(+C1:C3,))))
=SUM(INDEX(A:A,N(IF({1},C1:C3,))))
Давайте сосредоточимся на первой формуле и запустиминструмент оценки на некоторых версиях упрощенной формулы:
[1]=+N(INDEX({2;5;7},)) -> +N({2;5;7}) -> +{2;5;7}
[2]=+N(INDEX(C1:C3,)) -> +N($C$1:$C$3) -> +2
[3]=+N({2;5;7}) -> +N(2) -> +2
Сравнение результатов:
[1] & [2]: INDEX returns array / reference types
[2] & [3]: N takes reference / value types
[1] & [3]: N(INDEX(,)) returns an array that is passed like a value type
Результат строки выше можно обозначить как [{2;5;7}]
, где [.]
- это тип значенияссылка "на массив.В формулах такой результат может потребоваться передать в другую функцию IF или INDEX, чтобы избежать появления ошибки.Такой же тип результата получается из любой подобной комбинации типов данных:
array / reference -> value / reference
Другой пример - AGGREGATE с IF в 4-м аргументе.
Почемуздесь нужно использовать функцию N
?
Функция N
эффективно передает аргумент массива по ссылке , иначе результат функции IF
будетпередано по значению .
Чтобы увидеть это, примените инструмент Evaluate Formula со ссылочным аргументом в формуле =N(A1)
не преобразуется, тогда как в других функциях, таких как =ABS(A1)
.
Обратите внимание, что функции листа работаюттип суммы (XLOPER), который может быть комбинацией собственных типов данных Excel: значение (число, текст, логическое, любое);Массив;Ссылка.
Типы данных можно найти как в мастере функций, так и в инструментах «Оценка формул», выполнив шаги с аргументами ссылки и массива (например, A1 и {1}).
Для получения полного списка (+дальнейшие ссылки) см .: https://chandoo.org/forum/threads/excel-function-reference.35686/