В 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
, должны игнорироваться.
Знаете ли вы, как изменить формулу, чтобы получить ожидаемый результат?
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))))
На самом деле я применяю обе формулы в исходном файле. Если у вас есть решение и для другого варианта, было бы здорово.
В основном измените @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)
)
)
)
)
Непроверено: пробовали ли вы назвать результат расчета
res
и использоватьIF(res = "","",res)
?