#excel
#excel
Вопрос:
Здравствуйте, я пытаюсь решить проблему, из-за которой у меня поджарился мозг. У меня есть две таблицы, Table1 и Table2. В таблице 1 есть список артикулов, а также отдел / класс / штраф, которые по сути представляют собой разбивку по группам продуктов. Здесь есть иерархия. У каждого отдела есть подкласс, и каждый класс можно разбить на более мелкие тонкие линии. Отдел> класс> Тонкая грань. Таблица 2 содержит информацию о разметке. Я пытаюсь сопоставить правильную разметку в таблице 2 с соответствующим DCF в таблице 1. Вот кикер: не все наценки соответствуют точному DCF, некоторые наценки применяются только к определенному отделу / классу или даже только к отделу.
Вот моя логика:
- ЕСЛИ DCF(Dept / class / fine) из table1 соответствует table2, найдите запись разметки cus1 с соответствующим DCF и верните ее в table1.
- Если значение Fine отсутствует, верните значение для сопоставления Dept TRUE / Class True / Fine NULL .
- Если отсутствуют как Class, так и Fine, верните значение только для отдела TRUE / Class NULL / Fine NULL .
Я могу заставить это уравнение работать каждый раз, если все 3 DCF совпадают, но когда я начинаю добавлять логические тесты в микс, я, похоже, не могу найти способ заставить Excel найти правильную ячейку для индексации. Вот моя текущая итерация этой формулы (здесь мне не хватает окончательных критериев. У меня есть только шаги 1 и 2 из моей логики в этом уравнении, нужно будет добавить окончательные критерии, как только я их сглажу).
Вот моя формула:
=IF(AND(
COUNTIFS(Table2[dept],[@dept],Table2[class],[@class])>0,
COUNTIFS(Table2[fine],[@fine])<1),
INDEX(Table2[markup],MATCH(Table1[[#Headers],[cus1]]amp;[@dept]amp;[@class],Table2[custype]amp;Table2[dept]amp;Table2[class],0)),
INDEX(Table2[markup],MATCH(Table1[[#Headers],[cus1]]amp;[@dept]amp;[@class]amp;[@fine],Table2[custype]amp;Table2[dept]amp;Table2[class]amp;Table2[fine],0)))
Разбивка формулы:
Если table2[dept]
совпадают [@dept]
и table2[class]
совпадают [@class]
, а table2[fine] != [@fine]
затем сопоставляют значения в table2
и возвращают индекс разметки. Проблема с этой формулой заключается в том, что она возвращает первый экземпляр отдела / класса и игнорирует, отсутствует ли класс или нет. Строка 3 в таблице 1 возвращает 0,65 и должна возвращать 0,4.
Комментарии:
1. Это немного сбивает с толку — вы хотите, чтобы три #N / A в table1 были #N / A, или он должен найти строку, соответствующую первым двум (dept и class), или в противном случае это просто dept?
Ответ №1:
Вы можете попробовать следующую формулу:
=INDEX(M:M,
AGGREGATE(15,6,
ROW(Table2[markup])/
(((([@dept]=Table2[dept])*4 (([@class]=Table2[class])*3) (([@fine]=Table2[fine])*2 (""=Table2[class]) (""=Table2[fine]))))=
MAX(((([@dept]=Table2[dept])*4 (([@class]=Table2[class])*3) (([@fine]=Table2[fine])*2 (""=Table2[class]) (""=Table2[fine])))))),1))
Комментарии:
1. Большое вам спасибо за усилия по этому. Это очень интересный подход, который я раньше не рассматривал. Я никогда не использовал агрегатную функцию на практике, поэтому я потрачу некоторое время на ее анализ, чтобы лучше понять. После утреннего обновления я смог решить свою проблему. Вот моя формула:
2. =IFERROR(ИНДЕКС(Таблица2[разметка],СОВПАДЕНИЕ(1,(Таблица1[[#заголовки],[cus1]] =Таблица2[пользовательский тип])*([@dept]=Таблица2[отдел])*([@class]=Таблица2[класс])*([@нормально]= Таблица2[нормально]),0)),IFERROR(ИНДЕКС(Таблица2[разметка],СОВПАДЕНИЕ(1,(Таблица1[[#заголовки],[cus1]] =Таблица2[пользовательский тип])*([@dept]=Таблица2[отдел])*([@класс]= Таблица2[класс])*(«»= Таблица2[нормально]),0)),ИНДЕКС(Таблица2[разметка],СОВПАДЕНИЕ(1,(Таблица1[[#Заголовки],[cus1]] =Таблица2[пользовательский тип])*([@dept]=Таблица2[отдел])*(«» = Таблица2 [класс])*(«»= Таблица2[нормально]),0))))