Понимание того, как Excel обрабатывает функции массива - PullRequest
0 голосов
/ 25 сентября 2018

Этот вопрос основан на чьем-то другом вопросе, на который я ответил.Вы можете найти оригинальный вопрос здесь , если хотите.(И, возможно, предоставьте лучший ответ, чем я.) Однако все, что вам нужно для ответа на этот вопрос, находится прямо здесь.

Справочная информация

Учитывая следующие данные вA1: C5

+-------------+--------+----------+
| Invoice Nbr |  Type  |  Status  |
+-------------+--------+----------+
| A0001       | Credit | Paid     |
| A0002       | Credit | Not Paid |
| B0001       | Debit  | Paid     |
| B0002       | Debit  | Not Paid |
+-------------+--------+----------+

Цель состояла в том, чтобы найти определенное значение в таблице, используя формулу массива, которая оценивала два столбца.То есть, дайте мне первый Счет (столбец A), где Тип равен Дебет и Статус равен Не оплачен .

Моим первым ответом была попытка исправить то, что я считал проблемой условного оператора.Я поместил обертку AND вокруг двух условий следующим образом:

{=INDEX($A$2:$A$5,
        SMALL(IF(AND($B$2:$B$5 = "Debit", 
                     $C$2:$C$5 = "Not Paid"),
                 ROW($A$2:$A$5)-ROW($A$2)+1),
              1)
       )}

Однако это не сработало.

Я закончил тем, что предложил этот ответ, потому что на самом деле он работает:

{=INDEX($A$2:$A$5,
        SMALL(IF($B$2:$B$5 & $C$2:$C$5 = "DebitNot Paid",
                 ROW($A$2:$A$5)-ROW($A$2)+1),
              1)
       )}

Мой вопрос

Формулы-массивы в Excel иногда так сильно меня раздражают.Это кажется , как будто любой из них должен обеспечить результат B0002 .На самом деле, только вторая формула дает желаемый результат.Какому принципу или процессу оценки соответствует Excel (2013), что делает это так?Или, другими словами, что я не понимаю о том, как Excel управляет формулами массива?

Ответы [ 3 ]

0 голосов
/ 26 сентября 2018

AND и OR обычно плохо работают с формулами массива, поскольку они возвращают результат single (не массив).

Thisчасть вашей формулы:

AND($B$2:$B$5 = "Debit", $C$2:$C$5 = "Not Paid")

Возвращает один TRUE (не массив из TRUE / FALSE значений), если $B$2:$B$5 все Debit и , если все $C$2:$C$5 равны Not Paid (и возвращают FALSE в противном случае).

Эта часть вашей формулы возвращает то, что вы хотите (массив из TRUE / FALSE значений):

$B$2:$B$5 & $C$2:$C$5 = "DebitNot Paid"

Лично мне этот метод не очень нравится, я бы вместо этого сделал что-то вроде:

($B$2:$B$5="Debit")*($C$2:$C$5="Not Paid")

SIDE NOTE

Хотя в этой конкретной проблеме это не имеет значения, проблема с объединением строк и сравнением с результатом состоит в том, что вы можете получить ложный положительный результат, если не будете осторожны.

Простой пример:

(A1="ab")*(B1="cd")

Вернет "немного" другой результат, чем:

A1&B1 = "abcd"

Потому что, если, например, A1 равно abc and B1 равно d, верхняя формула возвращает FALSE, но нижняя формула возвращает TRUE.

Но опять же ... в зависимости от приложения, может быть, это равно то, что ты хочешь.Просто будьте осторожны при объединении строк и сравнении результатов по этой причине.

Итог ... Как правило, вы должны избегать AND и OR в формулах массива, потому что они, ну, в общем, не возвращают массивы.

0 голосов
/ 26 сентября 2018

@ StoneGiant прав.Есть функции, которые нельзя использовать внутри формул массива, потому что их единственная «причина существования» состоит в том, чтобы превратить массив в скалярное значение.И иногда вы на самом деле хотите, чтобы эти функции возвращали единственное значение в формуле массива, так как бы алгоритм выполнения формулы узнал, каким образом вы этого хотите.

AND() и OR() являются хорошими примерамиэтот.=AND(array of values) возвращает одно значение.MIN() является еще одним примером.Возьмите формулу массива

= SUM ((A1: A10 = "Боб") * (Мин. (B1: B10))

MIN(), предполагается, что она принимает набор значений и возвращаетсамое низкое. Как запрограммировать MIN() для возврата массива? Где вы решаете, что является самым низким в каком контексте? Вы не можете. Вот почему это не работает в формулах массива.

Взять SMALL()Затем он может вернуть формулу массива, поскольку предполагается, что он должен возвращать не только самое низкое значение, но и самое низкое n-е значение. Благодаря этому n-му аргументу теперь можно возвращать массив

=SMALL(A1:A10,{2,3})
* 1020.* Это вернет массив с двумя элементами. MS мог бы запрограммировать маленький, чтобы он не работал как формула массива, но в целом я обнаружил, что они включали функциональность массива везде, где это было практично.

Я сказал AND() и OR() являются хорошими примерами. MS могла бы запрограммировать их на возвращение массива, подобного комментарию @ StoneGiant. Для меня это было бы странным дизайнерским решением, но они могли бы это сделать. Но у них уже есть AND иИЛИ в массиве формулакак.Умножьте на И и добавьте к ИЛИ.

=MAX((B2:B5="Debit)*(C2:C5="Not Paid")*(ROW(B2:B5))

Это вернет номер строки последней строки, которая является дебетовой и не оплаченной.(Вы, например, задали проблему первым, но MIN вводит проблемы, которые усложняют этот пример).Умножения между равенствами такие же, как и AND.Если вы хотели, чтобы в последней строке был дебет, а в столбце C указано «Не оплачено» или «Не уверен», вы можете сделать это с добавлением.

=MAX((B2:B5="Debit)*((C2:C5="Not Paid")+(C2:C5="Not Sure"))*(ROW(B2:B5))

Знак плюс - это ИЛИ между этими двумя наборами скобок.И результаты этого ИЛИ включаются в другие скобки в виде И (умноженного).

Вы можете поместить их в ИНДЕКС

=INDEX(A2:A5, MAX((B2:B5="Debit)*(C2:C5="Not Paid")*(ROW(B2:B5)))

Итак, чтобы ответить на ваш вопрос, я думаю:Обычно функции, целью которых является преобразование набора значений в одно значение, не работают внутри формул массива.AND() и OR() являются чем-то особенным, потому что сложение и вычитание уже делают это внутри формул массива.

Подробнее о массивах см. Здесь http://dailydoseofexcel.com/archives/2004/04/05/anatomy-of-an-array-formula/

0 голосов
/ 26 сентября 2018

Я не уверен, с какой частью формул массива у вас возникли проблемы - но, если честно, мне потребовалось длинное время, чтобы обернуть их вокруг, в основном потому, что я редко имелпотребность в них.

Большая часть причины заключается в том, что в Excel часто есть несколько способов выполнить одну и ту же задачу.Например, в случае вашего примера, я бы просто вставил скрытый «столбец помощника», чтобы объединить Type и Status, слева от столбца Invoice #, и сделал бы базовый VLOOKUP в этом диапазоне..

Формула массива - это формула, которая может выполнять несколько вычислений для одного или нескольких элементов в массиве.Вы можете представлять массив как строку значений, столбец значений или комбинацию строк и столбцов значений.Формулы массива могут возвращать либо несколько результатов , либо один результат .

Например,

  • вы можете создать формулу массива в диапазоне ячеек и использовать формулу массива для вычисления столбца или строки промежуточных итогов.
  • Вы также можете поместить формулу массива в одну ячейку и рассчитать одну сумму.

Формула массива, которая включает в себя несколько ячеек, называется формулой из нескольких ячеек, а формула массива в одной ячейке называется формулой из одной ячейки.
(Источник )


Что касается вашего примера вопроса, возможно, следующие шаги помогут пролить немного света.

Это предполагает, что вы уже знаете основыиспользуя функции Match / Index для поиска.

image

Формула без всех $ абсолютных эталонных маркеров :

=INDEX(B3:B6,MATCH(F3&G3,C3:C6&D3:D6,0))

с разбивкой по ним:

  • F3&G3 объединяет (объединяет) Typeи Status мы ищем, в одну строку, например DebitPaid
    • массив, в котором мы ищем, это C3:C6&D3:D6, что-то вроде:
    • C3&D3 и C4&D4 и C5&D5 и C6&D6
    • 0 указывает, что мы хотим точное соответствие.(См. документы для MATCH.)

Часть MATCH только формулы в H3 вернет 3, так каксовпадение найдено в 3-м подмножестве массива (иначе, в 3-й строке сверху нашего массива).

Затем, обернув INDEX вокруг него, мы можем заставить Excel возвращать "3-е значение вниз""из столбца Invoice #.

Добавляя $ знаки доллара для обозначения абсолютных ссылок, мы можем затем скопировать или« перетащить »формулу на необходимое расстояние.

? Запомнитечто для ввода формулы массива необходимо использовать Ctrl + Shift + Введите .

См. мой другой ответ здесь для более подробного объяснения и примеров ссылок Index / Match и Absolute Relative.


Дополнительная информация:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...