Excel: SMALL (), IF () и ROW () для поиска номеров строк значений с использованием нескольких критериев - AND () не работает - PullRequest
0 голосов
/ 17 апреля 2019

У меня есть справочная таблица с именем Purchases, которая выглядит примерно так:

        A           B              C              D
1       Ord_ID      Supplier       PO_Date        Receipt_Quantity
2       PO101       Aa             11/1/2017      5
3       PO102       Bb             12/1/2017      12
4       PO103       Cc             12/15/2017     100
5       PO104       Bb             1/15/2018      8
6       PO105       Dd             2/1/2018       30
7       PO106       Bb             3/1/2018       15
8       PO107       Bb             4/1/2018       10
...

У меня есть отдельный лист с именем Supplier Bb Data, который должен возвращать номера строк данных Purchases дляПоставщик Bb.Формула выглядит следующим образом и находится в ячейках A10, A11, A12 и т. Д.: * 10101

=SMALL(IF('Purchases'!$B:$B=$A$1, ROW('Purchases'!$B:$B)), ROW(1:1))
=SMALL(IF('Purchases'!$B:$B=$A$1, ROW('Purchases'!$B:$B)), ROW(2:2))
=SMALL(IF('Purchases'!$B:$B=$A$1, ROW('Purchases'!$B:$B)), ROW(3:3))
...

A1 в Supplier Bb Data содержит значение для поиска "Bb».

Эта формула работает;он корректно возвращает номера строк из Purchases, которые включают PO для поставщика Bb.(3, 5, 7, 8 и т. Д.)

Однако я хочу иметь возможность возвращать более конкретные данные: строки, где Supplier = Bb И PO_Date >= 1/1/2018, ИPO_Date <= 3/1/2018.Следовательно, возвращая 5 и 7.

Казалось, что это будет просто;Я попробовал это (предполагая, что 1/1/2018 и 3/1/2018 находятся в ячейках A2 и A3, соответственно):

=SMALL(IF(AND('Purchases'!$B:$B=$A$1, 'Purchases'!$C$C>=$A$2, 'Purchases!$C$C<=$A$3), 
ROW('Purchases'!$B:$B)), ROW(1:1))

Когда я пытаюсь это сделать, Excel просто возвращает 0 для первого рядаи ошибки для всех следующих строк.

Разве AND() просто не работает внутри оператора IF()?Что еще я могу попытаться заставить это работать?

Я всегда нажимаю Ctrl+Shift+Enter для этих ячеек, потому что они являются формулами массива, так что это не проблема.

Ответы [ 2 ]

1 голос
/ 17 апреля 2019

Функция AND сама выполняет циклический ( стиль массива ) расчет. Впоследствии функции И или ИЛИ не очень хорошо сочетаются с другими в формуле стиля массива (CSE). Сложите условия во вложенном IF или используйте AGGREGATE для своих целей.

'array style with CSE
=SMALL(IF(Purchases!$B:$B=$A$1, IF(Purchases!$C:$C>=$A$2, IF(Purchases!$C:$C<=$A$3, ROW($B:$B)))), ROW(1:1))

'standard style without CSE
=AGGREGATE(15, 7, ROW(B:B)/((Purchases!B:B=A$1)*(Purchases!C:C>=A$2)*(Purchases!C:C<=A$3)), ROW(1:1))
  • Вы пропустили : в 'Purchases'!$C$C.
  • Все листы в книге имеют одинаковое количество строк. ROW(B:B) может использоваться вместо ROW('Purchases'!$B:$B)).
  • ROW(1:1) указывает, что вы перетаскиваете вниз для последовательных k параметров. Нет необходимости блокировать столбцы как абсолютные.
  • Формулы или функции массива с циклическим вычислением работают намного эффективнее, если вы не используете полные ссылки на столбцы. Учтите следующее:

    =AGGREGATE(15, 7, ROW($1:$999)/((Purchases!B$1:B$999=A$1)*(Purchases!C$1:C$999>=A$2)*(Purchases!C$1:C$999<=A$3)), ROW(1:1))
    
0 голосов
/ 17 апреля 2019

Кроме того, вы можете комбинировать свой МАЛЕНЬКИЙ + ПЧ с функцией SUMPRODUCT (Ctrl + Shift + Enter):

=IFERROR(SUMPRODUCT(SMALL(IF((Purchases!$B$1:$B$8=$A$1)*(Purchases!$C$1:$C$8>=$A$2)*(Purchases!$C$1:$C$8<=$A$3)=0,"",(ROW(Purchases!$B$1:$B$8))),ROW(1:1))),"")
...