Я хотел бы использовать функцию фильтра, чтобы при выборе различных вариантов она соответствующим образом фильтровала данные, даже если иногда выбрано «Все» или просто оставлено пустым.
Я могу сделать это для одного выбора, используя:
=FILTER(A7:A10,A7:A10=b2,A7:A10)
но, похоже, не работает, когда я должен был использовать несколько вариантов:
=FILTER(A7:A10,(A7:A10=b2,A7:A10)*(B7:B10=b3,B7:B10))
или
=FILTER(A7:A10,(A7:A10=b2)*(B7:B10=b3),A7:A10)
Попробуйте использовать следующую формулу:
=LET(
α, A7:B10,
λ, LAMBDA(δ,ε,ABS(OR((δ = "ALL"),ISBLANK(δ))-(ε=δ))),
FILTER(α,λ(B2,TAKE(α,,1))*λ(B3,TAKE(α,,-1))))
@andyleary, какие все условия. Возможно ли, что будут только ALL
для Name:
или только для Leader
ALL
?
Имя может быть All, a или b. Лидером может быть All, 1, 2 или 3.
@andyleary, но никогда не бывает пустым, верно?
да, оно тоже может быть пустым. Я думал использовать подстановочный знак, например **, но, похоже, это не работает с функцией фильтра.
@andyleary у меня есть для тебя обновление, не стесняйся протестировать!!
=LET(data,A7:B10,crit,B2:B3,
OneOrFilter,LAMBDA(array,crit,IF(OR(crit = "All",crit = ""),1,array=crit)),
nf,OneOrFilter(CHOOSECOLS(data,1),INDEX(crit,1)),
lf,OneOrFilter(CHOOSECOLS(data,2),INDEX(crit,2)),
IF(AND(nf=1,lf=1),data,FILTER(data,nf*lf,"")))
то есть
=LET(
OneOrFilter,LAMBDA(array,crit,IF(OR(crit = "All",crit = ""),1,array=crit)),
nf,OneOrFilter(A7:A10,B2),
lf,OneOrFilter(B7:B10,B3),
IF(AND(nf=1,lf=1),A7:B10,FILTER(A7:B10,nf*lf,"")))
OneOrFilter
возвращает либо 1
, если критерием является «Все» или пустое значение, либо массив TRUE/FALSE
, как результат сравнения столбца с критерием.1
когда требуется показать все данные. В противном случае покажите отфильтрованные данные.include_all, SEQUENCE(ROWS(data), , 1, 0)
= 1 (TRUE)
для всех строк.
=LAMBDA(data, crit_1, crit_2,
LET(
include_all, SEQUENCE(ROWS(data), , 1, 0),
all_or_crit, LAMBDA(col_num, crit,
IF(
OR(LEN(TRIM(crit)) = 0, TRIM(crit) = "ALL"),
include_all,
INDEX(data, , col_num) = crit
)
),
FILTER(
data,
all_or_crit(1, crit_1) *
all_or_crit(2, crit_2)
)
)
)(A7:B10, B2, B3)
Возможность частичного совпадения (без учета регистра с помощью SEARCH
) путем ввода текста критерия с помощью *
:
=LAMBDA(data, crit_1, crit_2,
LET(
include_all, SEQUENCE(ROWS(data), , 1, 0),
all_or_crit, LAMBDA(col_num, crit,
IFS(
OR(
LEN(TRIM(crit)) = 0,
TRIM(crit) = "ALL"
),
include_all,
ISNUMBER(SEARCH("~*", crit)),
ISNUMBER(
SEARCH(crit, INDEX(data, , col_num))
),
TRUE,
INDEX(data, , col_num) = crit
)
),
FILTER(
data,
all_or_crit(1, crit_1) *
all_or_crit(2, crit_2)
)
)
)(A7:B10, B2, B3)
b3 тоже может быть «всем». К вашему сведению, в моем отчете также есть много вариантов выбора, так что чем проще, тем лучше :-)