Фильтруйте и сортируйте данные с помощью нескольких критериев столбца и строки, а затем сопоставляйте с ними соответствующие данные с помощью нескольких гибких return_arrays

0 А Б С Д Э Ф г ЧАС я Дж К л М Н О 1 Продукт Магазин 2023-С 2023-М 2024-С 2024-М Тип 2 3 500 4 P-линия_A Шаг 1 5 Прод_А магазин3 80 2% 500 22% т1 ColCrit1 ColCrit2 ColCrit3 6 Prod_B магазин2 320 23% 180 60% т1 Прод_Д магазин1 т3 7 Prod_B магазин1 90 8% 300 36% т2 Prod_G магазин3 т4 8 Prod_C магазин3 500 15% 657 16% т1 магазин4 9 Прод_Д магазин1 160 17% 500 15% т3 10 Прод_Д магазин1 500 30% 600 8% т3 строкакрит 11 Прод_Д магазин1 130 4% 300 4% т3 2024-С 12 Общий 1810 г. 3037 13 14 600 Шаг 2 15 300 искомый_массив ret_array1 ret_array2 16 P-линия_B 2024-С Продукт Тип 17 Prod_E магазин2 75 10% 450 10% т1 18 Prod_F магазин4 60 8% 370 4% т2 19 Prod_F магазин1 500 11% 850 4% т2 Шаг 3 20 Prod_G магазин3 350 8% 150 15% т3 Строки Начинать 21 Prod_G магазин3 60 47% 600 7% т4 10 2 22 Prod_G магазин4 90 25% 830 35% т4 23 Prod_G магазин2 390 9% 325 13% т1 24 Prod_G магазин3 90 30% 300 9% т3 Шаг 4 25 Prod_G магазин4 90 5% 300 12% т3 Продукт Тип 2024-С 26 Prod_G магазин4 120 24% 300 24% т4 Прод_Д т3 600 27 Prod_G магазин4 135 35% 480 17% т4 Prod_G т4 600 28 Prod_H магазин2 935 27% 230 16% т1 Прод_Д т3 500 29 Prod_I магазин3 134 18% 600 42% т2 Prod_G т4 480 30 Общий 3029 5785 Прод_Д т3 300 31 Prod_G т3 300 32 Prod_G т3 300 33 Prod_G т4 300 34 Prod_G т3 150 35 36

Цель

Конечным результатом является Range M26:O34, который представляет собой нисходящий список на основе lookup_array в Cell M16 и нескольких фильтров столбцов и строк (Range M6:M8,Range N6:O8, Range O6:O8 и Cell M11) и выбранных позиций в рейтинге на основе Cell M21 и Cell N21.

Чтобы получить этот список, необходимо выполнить следующие шаги:
(Вы также можете увидеть шаги в таблице в столбце M, чтобы вам было легче следовать инструкциям)

  1. Определите несколько критериев столбца в Range M6:O6 и критерии строки в Cell M11. Все эти критерии являются AND критериями. После фильтрации список следует отсортировать по убыванию.
  2. На основе шага 1 у вас будет нисходящий список, соответствующий критериям столбца и строки. Для этого списка следует добавить соответствующие значения, основанные на ret_array1 в Cell N16 и ret_array2 в Cell O16.
    (Примечание: lookup_array = rowCrit --> Cell M16 = Cell M11)
  3. Из списка на шаге 2 должны отображаться только те значения, которые ранжированы по позициям на основе Cell M21 и Cell N21.
    В этом случае 10 positions после 1st position.
  4. После шагов 1–3 на шаге 4 должен появиться окончательный список.

Поэтому вкратце мне нужны эти две формулы:

Формула 1: Получение нисходящего списка с учетом нескольких критериев и отображение только определенных позиций из этого списка.
Формула 2: Получение соответствующих данных на основе нескольких гибких return_arrays.


Текущее состояние

С помощью предыдущих вопросов я смог применить эти две формулы:

1. Получаем необходимый список
Ответ на этот вопрос

=TOCOL(INDEX(SORT(
    LET(
    a,COUNTIF(M6:M8,A1:A31)+AND(M6:M8 = ""),
    b,COUNTIF(N6:N8,C1:C31)+AND(N6:N8 = ""),
    c,COUNTIF(O6:O8,K1:K31)+AND(O6:O8 = ""),
    FILTER(FILTER(A1:K31,(A1:K1=M11),""),a*b*c,"")),,-1),SEQUENCE(M21,,N21)),2)

Эта формула уже работает отлично и без каких-либо проблем.

2. Получение соответствующих данных
Ответ на этот вопрос

SORT(FILTER(CHOOSECOL(A1:K30,
         XMATCH(M16,A1:K1),
         XMATCH(N16,A1:K1),
         XMATCH(O16,A1:K1)),
             (AND(M6:M8 = "")+COUNTIF(M6:M8,A1:A30))*
             (AND(N6:N8 = "")+COUNTIF(N6:N8,C1:C30))*
             (AND(O6:O8 = "")+COUNTIF(O6:O8,K1:K30)),""),,-1)

Эта формула почти дает мне правильный результат.


Вопрос

Что касается второй формулы, я не знаю, как к ней применить SEQUENCE и как упорядочить columns, чтобы они соответствовали желаемому результату, показанному в таблице выше.

Что мне нравится в обеих формулах, так это то, что к ним очень легко связать дополнительные критерии столбца, поскольку в исходном файле их еще больше. Было бы здорово сохранить эту гибкость.

Есть ли у вас идеи, как решить проблему?

Попробуйте: =LET( a,COUNTIF(M6:M8,A1:A31)+AND(M6:M8 = ""), b,COUNTIF(N6:N8,C1:C31)+AND(N6:N8 = ""), c,COUNTIF(O6:O8,K1:K31)+AND(O6:O8 = ""), WRAPROWS(TOCOL(INDEX(SORT(FILTER(HSTACK(CHOOSECOLS(A1:K31,XM‌​ATCH(HSTACK(N16,O16,‌​M16),A1:K1)),FILTER(‌​A1:K31,A1:K1=M11,"")‌​),a*b*c,""),3,-1),SE‌​QUENCE(M21,,N21),{1,‌​2,3}),2),3))

Mayukh Bhattacharya 09.07.2024 19:14
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
2
1
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Пытаться :


=LET(
    _a, COUNTIF(M6:M8,A1:A31)+AND(M6:M8 = ""),
    _b, COUNTIF(N6:N8,C1:C31)+AND(N6:N8 = ""),
    _c, COUNTIF(O6:O8,K1:K31)+AND(O6:O8 = ""),
    _d, CHOOSECOLS(A1:K31,XMATCH(HSTACK(N16,O16,M16),A1:K1)),
    _e, SORT(FILTER(HSTACK(_d,FILTER(A1:K31,A1:K1=M11,"")),_a*_b*_c,""),3,-1),
    WRAPROWS(TOCOL(INDEX(_e,SEQUENCE(M21,,N21),{1,2,3}),2),3))

В зависимости от языка, который вы используете в Excel, {1,2,3} можно ввести как {1.2.3}, чтобы это работало.

Например, в немецком Excel формула работает так:

=LET(
    _a; ZÄHLENWENN(M6:M8;A1:A31)+UND(M6:M8 = "");
    _b; ZÄHLENWENN(N6:N8;C1:C31)+UND(N6:N8 = "");
    _c; ZÄHLENWENN(O6:O8;K1:K31)+UND(O6:O8 = "");
    _d; SPALTENWAHL(A1:K31;XVERGLEICH(HSTAPELN(N16;O16;M16);A1:K1));
    _e; SORTIEREN(FILTER(HSTAPELN(_d;FILTER(A1:K31;A1:K1=M11;""));_a*_b*_c;"");3;-1);
    ZEILENUMBRUCH(ZUSPALTE(INDEX(_e;SEQUENZ(M21;;N21);{1.2.3});2);3))

Альтернативно замена {1.2.3} на SEQUENZ(;3) также работает:

=LET(
    _a; ZÄHLENWENN(M6:M8;A1:A31)+UND(M6:M8 = "");
    _b; ZÄHLENWENN(N6:N8;C1:C31)+UND(N6:N8 = "");
    _c; ZÄHLENWENN(O6:O8;K1:K31)+UND(O6:O8 = "");
    _d; SPALTENWAHL(A1:K31;XVERGLEICH(HSTAPELN(N16;O16;M16);A1:K1));
    _e; SORTIEREN(FILTER(HSTAPELN(_d;FILTER(A1:K31;A1:K1=M11;""));_a*_b*_c;"");3;-1);
    ZEILENUMBRUCH(ZUSPALTE(INDEX(_e;SEQUENZ(M21;;N21);SEQUENZ(;3));2);3))

См. вопрос в отредактированном ответе.

Michi 10.07.2024 08:20

@Мичи, ты не против, если я выложу Excel? Почему на вашей стороне возвращается только одна строка? Есть ли пробелы в ваших данных или что-то в этом роде?

Mayukh Bhattacharya 10.07.2024 08:24

Для меня это нормально, если вы опубликуете Excel.

Michi 10.07.2024 08:29

@Michi Эти цифры 10 и 2 настоящие цифры?

Mayukh Bhattacharya 10.07.2024 08:30

Да, это цифры. Я просто выровнял их по левому краю.

Michi 10.07.2024 08:31

@Michi скачать можно здесь: ссылка

Mayukh Bhattacharya 10.07.2024 08:31

Первое мое предположение: эта часть {1;2;3} может вызвать проблему. В немецком формате Excel мне нужно изменить «,» на «;» в формуле. Наверное, в этой части формулы мне нужно остановиться на ",". Однако когда я меняю эту часть на «», появляется сообщение об ошибке Excel: «С этой формулой возникла проблема». Что еще странно, так это то, что когда я открываю вашу ссылку, названия формул переводятся на немецкий язык, но знак "," остается, и формула работает. См. скриншот 3, который я прикрепил.

Michi 10.07.2024 08:42

@Мичи, хммм, попробуй сделать это . или / может быть вот так. простой способ обнаружить запись в какой-либо ячейке. 1,2,3 и используйте HSTACK() для объединения, затем выберите формулу HSTACK() и нажмите F9, иначе при выборе отобразится разделитель, который вам нужно будет использовать.

Mayukh Bhattacharya 10.07.2024 08:43

@Michi или используйте вместо {1,2,3} --> SEQUENCE(;3) --> SEQUENZ(;3)

Mayukh Bhattacharya 10.07.2024 08:47

Изменение на "." работал. Проголосуйте за дополнительную помощь с моей стороны.

Michi 10.07.2024 08:50

@Michi звучит хорошо, я прокомментировал альтернативный вариант вместо жесткого кодирования, используя SEQUENZ()

Mayukh Bhattacharya 10.07.2024 08:50

Спасибо. Это также работает. Я также добавил это в ответ.

Michi 10.07.2024 08:54

@Michi исправил опечатку с SEQUENCE() на SEQUENZ()

Mayukh Bhattacharya 10.07.2024 08:56

Другие вопросы по теме