Вы можете использовать COUNTIFS
для одновременной проверки нескольких столбцов. Например,
=COUNTIFS(A3:A22, A2, B3:B22, "Y")
Это примет значение в ячейке A2 (CTCX733450), затем просмотрите следующие 20 строк (строки 3-22), чтобы узнать, сколько раз в столбце A используется это значение и Столбец B - «Y». Если он больше 0, то один из следующих 20 экземпляров этого вагона был выгружен.
Примечательно, что это «следующие 20 строк», а не «следующие 20 записей для того же вагона». Для , что , нам нужно будет использовать AGGREGATE
и INDEX
, чтобы найти время 20 th следующего появления вагона, которое будет последней проверяемой строкой.
Пока мы заменим это значение строки на ROW_VALUE
. Это позволяет нам переписать нашу формулу, используя INDEX
, следующим образом:
=COUNTIFS(A3:INDEX(A:A, ROW_VALUE), A2, B3:INDEX(B:B, ROW_VALUE), "Y")
Достаточно просто! Однако теперь сложнее всего выяснить, какое значение мы должны иметь для ROW_VALUE
. Здесь появляется AGGREGATE
.
Видите ли, мы можем использовать AGGREGATE
, чтобы получить k th (четвертый параметр) наименьший (первый параметр = 15
) значение без ошибки (Второй параметр = 6
) из списка значений (третий параметр). Мы также можем составить список строк, в которых столбец A совпадает со значением в A2, используя ошибки #DIV0!
(деление на ноль) и тот факт, что TRUE
/ FALSE
можно рассматривать как 1
/ 0
AGGREGATE(15, 6, Row(A:A)/(A:A=A2), k)
В вашем случае мы хотим, чтобы k было 20 + сколько экземпляров вагона у нас уже есть. Мы можем подсчитать, сколько копий вагона прошли нас, используя COUNTIF
, пока мы фиксируем один конец на первом ряду:
AGGREGATE(15, 6, Row(A:A)/(A:A=A2), 20+COUNTIF(A$1:A2, A2))
Теперь, в теории мы можно было засунуть это как наш ROW_VALUE
. На практике сразу вижу 2 большие проблемы. Первый, работающий с целыми столбцами, - это медленно . Во-вторых, что более важно: что произойдет, если останется меньше более 20 экземпляров вагона? Вы получаете ошибку #NUM!
, вот что.
Мы можем исправить обе эти проблемы с помощью COUNTA
(при условии, что нет строк без номеров вагонов). Для первого мы снова будем использовать INDEX
:
AGGREGATE(15, 6, Row(A$1:INDEX(A:A, COUNTA(A:A)))/(A$1:INDEX(A:A, COUNTA(A:A))=A2), 20+COUNTIF(A$1:A2, A2))
В качестве альтернативы вы можете изменить это, чтобы избавиться от COUNTIF
в конце, начав свой диапазон в следующей строке и просто ищу номер 20 th :
AGGREGATE(15, 6, Row(A3:INDEX(A:A, COUNTA(A:A)))/(A3:INDEX(A:A, COUNTA(A:A))=A2), 20)
Для второго вопроса мы будем использовать IFERROR
. Это простая функция - она просто говорит: «Верните это значение, если оно не является ошибкой - тогда используйте это другое значение вместо этого». Нашим «другим значением» будет COUNTA
столбца A, что должно дать нам последнюю строку в вашем списке вагонов:
IFERROR(AGGREGATE(15, 6, Row(A3:INDEX(A:A, COUNTA(A:A)))/(A3:INDEX(A:A, COUNTA(A:A))=A2), 20),COUNTA(A:A))
Это даст нам ROW_VALUE
, который мы можем подключить к нашему другому ранее COUNTIFS
:
=COUNTIFS(A3:INDEX(A:A, IFERROR(AGGREGATE(15, 6, Row(A3:INDEX(A:A, COUNTA(A:A)))/(A3:INDEX(A:A, COUNTA(A:A))=A2), 20),COUNTA(A:A))), A2, B3:INDEX(B:B, IFERROR(AGGREGATE(15, 6, Row(A3:INDEX(A:A, COUNTA(A:A)))/(A3:INDEX(A:A, COUNTA(A:A))=A2), 20),COUNTA(A:A))), "Y")
Наконец, и по желанию: мы можем немного увеличить время вычислений, определив, будет ли AGGREGATE
ошибка перед , проверив, есть ли составляют как минимум 20 въездов для вагона. Это также заменяет IFERROR
оператором IF
, но делает все уравнение длиннее:
=COUNTIFS(A3:INDEX(A:A, IF(COUNTIF(A3:INDEX(A:A, COUNTA(A:A)),A2)<20, COUNTA(A:A), AGGREGATE(15, 6, Row(A3:INDEX(A:A, COUNTA(A:A)))/(A3:INDEX(A:A, COUNTA(A:A))=A2), 20))), A2, B3:INDEX(B:B, IF(COUNTIF(A3:INDEX(A:A, COUNTA(A:A)),A2)<20, COUNTA(A:A), AGGREGATE(15, 6, Row(A3:INDEX(A:A, COUNTA(A:A)))/(A3:INDEX(A:A, COUNTA(A:A))=A2), 20))), "Y")
Мы заменили это ROW_VALUE
IFERROR(AGGREGATE(15, 6, Row(A3:INDEX(A:A, COUNTA(A:A)))/(A3:INDEX(A:A, COUNTA(A:A))=A2), 20),COUNTA(A:A))
на это.
IF(COUNTIF(A3:INDEX(A:A, COUNTA(A:A)),A2)<20, COUNTA(A:A), AGGREGATE(15, 6, Row(A3:INDEX(A:A, COUNTA(A:A)))/(A3:INDEX(A:A, COUNTA(A:A))=A2), 20))