Сопоставление и составление списка значений на основе значений, перечисленных в другом столбце

0 А Б С Д Э Ф г ЧАС я Дж К л М 1 Продукты Магазин 2023-С 2023-М 2024-С 2024-М 2 искомый_массив 3 Продукт А Магазин3 80 2% 120 22% 2024-С 4 Продукт Б Магазин1 320 17% 400 15% return_array 5 Продукт Б Магазин3 90 30% 750 8% 2024-М 6 Продукт Б Магазин2 500 4% 70 4% 7 8 400 выбранные данные 9 Продукт С Магазин2 160 10% 245 10% 400 Продукт Б 10 Продукт Д Магазин1 500 8% 130 4% 400 Продукт Е 11 Продукт Д Магазин4 130 11% 130 4% 70 Продукт Б 12 Продукт Е Магазин2 75 8% 650 15% 520 Продукт Н 13 Продукт Е Магазин1 60 47% 90 7% 130 Продукт Д 14 Продукт Е Магазин4 500 25% 400 35% 90 Продукт Е 15 130 Продукт Д 16 70 130 Продукт F 17 70 Продукт Н 18 Продукт Е Магазин3 350 9% 140 13% 19 Продукт F Магазин2 60 30% 130 9% 20 Продукт Г Магазин2 90 5% 370 12% 21 Продукт Н Магазин1 390 27% 70 16% 22 Продукт Н Магазин2 70 18% 520 42%

В Range M9:M17 я хочу получить соответствующие данные на основе значений в Range K9:17.

Это работает как при применении решений из этого вопроса , так и этого вопроса:

Вариант 1 (без гибкого return_array)

=LET(
     _Data, A3:I22,
     _Col, XLOOKUP(M3,A1:I1,_Data,""),
     _SelectedData, K9:K17,
     _Fx, LAMBDA(r,s, MAP(r,LAMBDA(c,COUNTIF(s:c,c)/10+c))),
     TOCOL(IF(_Fx(_Col,TAKE(_Col,1))=TOROW(_Fx(_SelectedData,
    TAKE(_SelectedData,1))),TAKE(_Data,,1),NA()),3,1))

Вариант 2 (с гибким return_array --> Cell M3)

=IFERROR(LET(
     a, K9:K17,
     b, A1:I1,
     c, A3:I22,
     d, XLOOKUP(M3,b,c,""),
     MAP(a,LAMBDA(e, @DROP(TOCOL(FILTER(IFS(d=e,c),M6=b),3),
     COUNTIF(K9:e,e)-1)))),"")

Однако, как вы можете видеть в моей таблице данных выше, может случиться так, что между данными есть пустые строки, содержащие значения (Cell H8 и Cell H16), которые также указаны в Range K9:K17.

В этом случае обе упомянутые выше формулы возвращают 0 между списком в Range M9:M17.

Чтобы избежать этой проблемы, в формулу должно быть каким-то образом добавлено условие, которое гласит, что все строки, которые не имеют значения в Column A, должны игнорироваться.

Знаете ли вы, как изменить формулу, чтобы получить ожидаемый результат?

Непроверено: пробовали ли вы назвать результат расчета res и использовать IF(res = "","",res)?

P.b 06.07.2024 21:52
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
2
1
106
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Сопоставление нескольких вхождений данных

  • Я не думаю, что формулу можно легко исправить. В любом случае, вот альтернатива.
  • Функция GetRunningCount ЛАМБДА возвращает текущий счетчик заданного (несортированного) столбца (array).
=LET(headers,A1:I1,data,A3:I22,lookup,K9:K22,
        lookup_header,M3,return_header,M5,
    GetRunningCount,LAMBDA(array,LET(
        so,SORT(HSTACK(SEQUENCE(ROWS(array)),array),2),
        d,DROP(so,,1),        
        SORTBY(SCAN(0,d=VSTACK("",DROP(d,-1)),LAMBDA(sr,r,
            IF(r,sr+1,1))),TAKE(so,,1)))),
    d,IF(data = "","",data),
    rci,XLOOKUP(return_header,headers,d),
    f,rci<>"",
    rc,FILTER(rci,f),
    lc,FILTER(XLOOKUP(lookup_header,headers,d),f),
    src,GetRunningCount(lc),
    drc,GetRunningCount(lookup),
    r,BYROW(SEQUENCE(ROWS(drc)),LAMBDA(r,
        XLOOKUP(1,(lc=INDEX(lookup,r))
            *(src=INDEX(drc,r)),rc,""))),
    r)
  • Замените последнюю r любой другой переменной, чтобы увидеть, что она содержит.
  • Обратите внимание, что r в BYROW — это другая переменная.

В варианте 2 не могли бы вы попробовать изменить

MAP(a, LAMBDA(e, @DROP(TOCOL(FILTER(IFS(d = e, c), M6 = b), 3),
COUNTIF(K9:e, e) - 1)))

к

MAP(a, LAMBDA(e, @DROP(TOCOL(FILTER(IFS(d = e, 
IF(LEN(TRIM(c)) = 0, NA(), c)), 
M6 = b), 3), COUNTIF(K9:e, e) - 1)))

поскольку TOCOL с вариантом 3 пропускает ячейки с ошибками.

приняв предыдущий ответ:

=LAMBDA(selected_data, data_range, col_headers, header_for_lookup, header_for_return,
    LET(
        lookup_col_0, INDEX(data_range, , XMATCH(header_for_lookup, col_headers)),
        return_col_0, INDEX(data_range, , XMATCH(header_for_return, col_headers)),
        comment_0, "remove cells with corressponding empty cells in return col",
        lookup_col, FILTER(lookup_col_0, LEN(TRIM(return_col_0)) > 0),
        return_col, FILTER(return_col_0, LEN(TRIM(return_col_0)) > 0),
        freq, LAMBDA(arr,
            LET(
                indices, SEQUENCE(ROWS(arr)),
                MAP(indices, LAMBDA(i, SUM(IF(TAKE(arr, i) = INDEX(arr, i, ), 1, 0))))
            )
        ),
        comment_1, "400 1, 400 2",
        lookup_col_with_freq, lookup_col & " " & freq(lookup_col),
        selected_col_with_freq, selected_data & " " & freq(selected_data),
        xlook, XLOOKUP(selected_col_with_freq, lookup_col_with_freq, return_col),
        formatted, IF(RIGHT(header_for_return, 2) = "-M", TEXT(xlook, "0%"), xlook),
        formatted
    )
)(K9:K17, A3:I22, A1:I1, M3, M6)

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

Быстрое исправление существующей формулы (я считаю, что в конечном итоге вам понадобится гибкий return_array):


=LET(
     _A, K6:K14,
     _B, A1:I1,
     _C, A3:I22,
     _D, XLOOKUP(M3,_B,_C,""),
     MAP(_A,LAMBDA(α, @DROP(TOCOL(FILTER(IFS(_D=α,IF(_C=0,x,_C)),M5=_B),3),
     COUNTIF(K6:α,α)-1))))

На самом деле я применяю обе формулы в исходном файле. Если у вас есть решение и для другого варианта, было бы здорово.

Michi 07.07.2024 08:37

В основном измените @DROP(FILTER(), Count-1) на index(FILTER(), COUNT, 1) в этом ответе: XLOOKUP с гибким столбцом для return_array, а не уникальными значениями в search_array

=LET(
    included, A3:A22 <> "",
    lookup_array, FILTER(XLOOKUP(M3, A1:I1, A3:I22, ""), included, ""),
    return_array, FILTER(XLOOKUP(M5, A1:I1, A3:I22, ""), included, ""),
    selected, K9:K17,
    BYROW(
        selected,
        LAMBDA(row,
            LET(
                filtered, FILTER(return_array, lookup_array = row, ""),
                current_count, COUNTIF(K9:row, row),
                INDEX(filtered, current_count, 1)
            )
        )
    )
)

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