Формула Excel Сравните данные с предыдущими 20 записями для изменения - PullRequest
0 голосов
/ 26 мая 2020

У меня есть таблица Excel для разгрузки сырья. Все проходят тестирование, но некоторых сразу не выгружают. Я пытаюсь создать формулу, которая смотрит на будущие 20 записей для одного и того же вагона и проверяет, изменилась ли она с «N» на «Y» для разгрузки.

Вот как выглядят мои данные:

CAR #       Offloaded?
CTCX733450      N
CTCX733450      Y
GATX207935      N
CTCX733472      Y
GATX207923      N
GATX207935      Y
GATX207923      Y

Я пробовал COUNTIF функций и IF функций. Я могу обнаружить повторяющиеся вагоны, но не могу сопоставить Y и N. с вагоном.

Любая помощь приветствуется.

1 Ответ

0 голосов
/ 26 мая 2020

Вы можете использовать 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))
...