Как отличить, нужно ли добавлять суппродукт с CSE или нет? - PullRequest
5 голосов
/ 24 октября 2019

Я иногда использую встроенную функциональность массива sumproduct, чтобы избежать необходимости вводить формулы с помощью Control Shift Enter. Но это не всегда работает. Например,

=SUMPRODUCT((LEN(B2:F2)-LEN(SUBSTITUTE(B2:F2,M$2:M$10,"")))*N$2:N$10)

будет работать, а

=SUMPRODUCT(--IF(ISNUMBER(N6:N9),N6:N9))

- не будет.

Мне не совсем понятно, почему первый дает правильные результаты,а второй нет.

1 Ответ

2 голосов
/ 24 октября 2019

Хороший вопрос. Эмпирическое правило для меня> Вы видите IF и диапазон для анализа> Вы нажимаете CSE.

Почему? Некоторые функции обрабатывают CSE для вас изначально (SUMPRODUCT является одной из них), но другие этого не делают, например SUM, но определенно также IF. Посмотрите здесь и здесь . Суть теории (AFAIK) в том, что CSE отключит нечто, называемое «неявное пересечение», которое объясняется здесь . Это сводится к:

"Неявное пересечение происходит, когда диапазон передается функции, которая ожидает скалярное (одиночное) значение . В этой ситуации Excel будетпопытаться разрешить формулу, используя ссылку в той же строке или в том же столбце ...... Ввод формулы массива с помощью Control + Shift + Enter (CSE) явно отключает неявное поведение пересечения. Это позволяет создавать формулы, которые управляют множественными значениями, вводимыми в качестве диапазонов. "

Поскольку вы используете IF, он не 'Неважно, что это в пределах SUMPRODUCT. Вам по-прежнему нужно нажимать CSE, чтобы отключить собственное «неявное пересечение», которое идет с использованием IF.


FWIW : некоторая дополнительная информацияо поведении, называемом «неявное пересечение».

Давайте представим следующие данные:

enter image description here

Я создал именованный диапазон с именем Vals из диапазона A2:C2. Теперь формула в B5 просто =Vals, но результат равен Val5. Значение неявного пересечения вернуло значение из моего именованного диапазона, который пересекался со столбцом, в который я ввел формулу.

Почему? Потому что в фоновом режиме (незаметно) Excel использовал оператор неявного пересечения ("@"), чтобы вернуть единственное значение из только что упомянутого пересечения. Если бы я использовал CSE (чтение, удаление логического оператора), возвращаемое значение было бы Val2 (верхнее левое значение в массиве).

"Неявная логика пересечения уменьшает много значенийк одному значению. Excel сделал это, чтобы заставить формулу возвращать одно значение, поскольку ячейка может содержать только одно значение. "

Логический оператор" @ "предотвратитвозврат массива и убедитесь, что вы получите одно возвращаемое значение. Удаление этого логического оператора (то, что мы делаем, нажимая CSE или используя функции, которые делают это изначально), заставит формулу возвращать массив.

Вы можете не видеть / знать об этом операторе, но с приходомдинамических массивов формул они будут в ваших формулах намного больше. См. эту MS-документацию по этому вопросу. Благодаря этим новым функциям удаление логического оператора не только вернет массив, но и приведет к передаче значений в соседние ячейки. Отсюда и термин «формулы динамического массива». Таким образом, вы можете увидеть новые формулы динамического массива как автоматизированную альтернативу для устаревших формул CSE с добавлением функции разлива среди других.


Итак, заключим:

Ваша вторая формула также может быть написана:

=@SUMPRODUCT(--@IF(@ISNUMBER(N6:N9),N6:N9))

Нажатие Ввод не работает, потому что только SUMPRODUCT изначальноотменяет (невидимый) логический оператор, в то время как IF ожидает только скалярное (одиночное) значение. Итак, незаметно, но эффективно ваша формула выглядит следующим образом:

=SUMPRODUCT(--@IF(@ISNUMBER(N6:N9),N6:N9))

Однако нажатие Control + Shift + Enter действительно исключитлогический оператор и эффективно сделать вашу формулу выглядеть так:

=SUMPRODUCT(--IF(ISNUMBER(N6:N9),N6:N9))

И, следовательно, возможность принимать массивы. Надеюсь, это прояснило, почему вам нужно было нажимать CSE со своей второй формулой IF.


Забавный факт: В следующий раз попробуйте написать =@SUMPRODUCT(... или =@IF(.... Вы заметите, что формула принята, но логический оператор исчезает. Знак того, что этот оператор используется в фоновом режиме =)

...