
Я имею дело с файлом Excel, похожим на этот (изменен/упрощен в целях конфиденциальности):
Заказ # | Задача | Машину мыли в рамках этого заказа? |
---|---|---|
1 | Обзор | Да |
1 | Поменять шины | Да |
1 | Мыть машину | Да |
2 | Обзор | Нет |
2 | Поменять шины | Нет |
2 | Поменять масло | Нет |
ДругойЗаданиямогут поделиться тем жеЗаказ #.
Мне нужна формула для заполнения третьего столбца (желтого на изображении) значением «Да», еслиЗадачаявляется частьюЗаказ #что включает в себяЗадача«Помойте машину» или ответьте «Нет», если это не так.
Я безуспешно искал решение в Интернете.
решение1
Ниже приведена последовательность из 5 формул. Каждая формула основана на предыдущей. Надеюсь, что такой прогресс сделает более легкими для понимания последующие.
[ Формула 1 из 5 ] Основополагающая формула
=IFERROR(IF(
MATCH(A2:A7,FILTER(A2:A7,B2:B7="Wash car"),0),
"yes"),"no")
- ЕСЛИфункция используетСООТВЕТСТВОВАТЬкак его
logical_test
.- СООТВЕТСТВОВАТЬиспользует каждый заказ по очереди как
search_key
- Аргумент
range
заполняется с помощьюФИЛЬТРфункция возврата списка заказов, где задача «Помыть машину»
- СООТВЕТСТВОВАТЬиспользует каждый заказ по очереди как
- TheЕСЛИ
value_if_true
Аргумент функции —"Yes"
value_if_false
опущено, так какlogical_test
используемый может возвращать толькоTRUE
или#N/A
- ЕСЛИОШИБКАзаменяет ошибки на
"No"
[ Формула 1 из 5 ] Основополагающая формула
[ Формула 2 из 5 ] Игнорировать пустые строки
=IF(A2:A7<>0, IFERROR(IF(
MATCH(A2:A7,FILTER(A2:A7,B2:B7="Wash car"),0),
"Yes"),"No"),"")
- Чтобы игнорировать пустые строки,ЕСЛИФункция добавляется с
value<>0
.logical_test
Она вернет:TRUE
для любой ячейки, содержащей ненулевое число, а также любую текстовую строку, даже содержащую цифры. например.("0"<>0)=TRUE
FALSE
для числа0
, а также пустых ячеек, которые Excel приводит к нулю. например, еслиOR(ISBLANK(A1),A1=0)
то(A1<>0)=FALSE
- TheОсновная формулаиспользуется как
value_if_true
value_if_false
является пустой строкой""
.
Этот подход пропускает возврат"No"
, предотвращая смещение строк из-за пробелов в данных.
[ Формула 2 из 5 ] Игнорировать пустые строки
[ Формула 3 из 5 ] Формула в строке заголовка
Перемещение формулы в строку заголовка может предотвратить ее перезапись.
=VSTACK("Wash on Order?",
IF(A2:A7<>0, IFERROR(IF(
MATCH(A2:A7,FILTER(A2:A7,B2:B7="Wash car"),0),
"Yes"),"No"),""))
- ВСТЕКпозволяет складывать массивы вертикально
- Первый использованный массив — заголовок
"Wash on Order?"
- Второй массив — это предыдущая формула.
[ Формула 3 из 5 ] Формула в строке заголовка
[ Формула 4 из 5 ] Добавлена функция LET
ПокаПОЗВОЛЯТЬсама по себе не добавляет много к предыдущей формуле, она применяется на этом этапе для пояснения преобразования. По мере усложнения формул полезностьПОЗВОЛЯТЬстановятся более ясными.
=LET(rng,A2:B7,
a,DROP(rng,,-1), b,DROP(rng,,1),
VSTACK("Wash on Order?",
IF(a<>0, IFERROR(IF(
MATCH(a, FILTER(a, b="Wash car"), 0),
"Yes"), "No"), "")))
- TheПОЗВОЛЯТЬФункция позволяет сохранять значения и формулы в переменных для повторного использования. Это может уменьшить повторение кода и длину формулы, а также может сделать сложные формулы более простыми для понимания и управления.
- Исходный диапазон сохраняется в
rng
. - Столбец A
a
и столбец Bb
возвращаются с помощьюУРОНИТЬдля отправки ненужной колонки. a
иb
теперь используются вместоA2:A7
иB2:B7
в формуле.
[ Формула 4 из 5 ] Добавлена функция LET
[ Формула 5 из 5 ] Автоматически определить размер диапазона
Позволяет данным расти без необходимости изменять формулу. Принимает полные столбцы, а затем изменяет размер массива по мере необходимости на основе заполненных данных. ЗначениеПОЗВОЛЯТЬполностью выставлен напоказ.
=LET(rng,A:B,
arr,DROP(FILTER(rng, ROW(rng)<=
MAX((rng<>0)*(ROW(rng)))),1),
a,DROP(arr,,-1), b,DROP(arr,,1),
VSTACK("Wash on Order?",
IF(a<>0, IFERROR(IF(MATCH(a,
FILTER(a, b="Wash car"), 0),
"yes"),"no"),"")))
- ФИЛЬТРвозвращает массив
arr
строк, номер строки которых совпадает<=
с номером последней строки, содержащей идентификатор заказа. - Последняя строка рассчитывается путем примененияМАКСв массив номеров строк, строки которых также содержат ненулевое значение. Звездочка
*
— это оператор «и»:MAX(ROW(rng)*rng<>0)
- Этот результирующий массив включает заголовок (строка 1), заказы, а также любые пробелы. Пробелы включены для того, чтобы гарантировать, что намеренные или случайные пробелы не приведут к смещению результатов относительно исходного диапазона.
- TheУРОНИТЬФункция используется для удаления строки заголовка. В качестве альтернативы, это можно сделать, добавивФИЛЬТРсостояние
ROW(rng)<>1
[ Формула 5 из 5 ] Автоматически определить размер диапазона
решение2
Следующее решение, по-видимому, соответствует целям, изложенным в вашем образце данных.
В пустом столбце
C
объединитеA
иB
столбцы с=concat(A2,B2)
(в ячейкеC2
) для каждой строки.В пустой столбец
D
добавьте следующую формулу, начиная сD2
. Это формула массива, поэтому вам нужно будет нажатьCTRL+SHIFT+ENTER
одновременно, чтобы она заработала.=IF(OR($A$1:$A$6=A1)*(OR($C$1:$C$6=CONCAT(A1,"Wash car"))),"Yes","No")
Скопируйте
D2
в оставшиеся строки.
Если я что-то упускаю из виду (а мне кажется, что я это делаю, поскольку мой набор данных для выборки очень ограничен), пожалуйста, дайте мне знать, и я постараюсь это исправить. Если это решение решит вашу проблему, пожалуйста, отметьте его как ответ.