Я пытаюсь построить VSTACK из динамического диапазона, используя REDUCE.
Что я получаю:
Что я хочу (обратите внимание, что значение XX игнорируется)
По сути, вопрос в том, как использовать условный HSTACK внутри LAMBDA внутри REDUCE. Здесь я хочу игнорировать ячейки со значением «XX» и создать динамическое разлив по HSTACK.
Я знаю, что мог бы просто использовать FILTER, но это всего лишь простой пример, где мне часто хочется выполнить более сложные условные изменения внутри сокращения в зависимости от значения ячейки, а затем HSTACK результатов (или игнорировать).
Я не понимаю, чем обусловлены значения #N/A.
HSTACK работает без условия, т.е. это работает (добавьте "%" и HSTACK):
Спасибо, Рори. Хороший пикап, думаю, в этом вся суть.
Используйте FILTER()
и TOROW()
. Пытаться-
=TOROW(FILTER(A1:A100,(A1:A100<>"XX")*(A1:A100<>""))&"%")
Для работы с REDUCE()
вам понадобится функция IF()
. =REDUCE("",A1:A6,LAMBDA(init,cll,HSTACK(init,IF(cll = "XX","",cll&"%"))))
.
С REDUCE
он помещает пустую ячейку между D
и E
, в то время как желаемый результат OP (второе изображение) не имеет ни одного, поэтому его все равно необходимо отфильтровать.
@user11222393 user11222393 Вы правы. Просто нужно отфильтровать или игнорировать пустые результаты.
У меня не получилось с ним работать REDUCE
; но вместо этого я использовал MAP с FILTER, возможно, этого будет достаточно для ваших будущих проектов:
=FILTER(MAP(A1:A7;LAMBDA(a;IF(a = "xx";"";a)));A1:A7<>"xx")
Разве это не выполнение одной и той же работы дважды? Почему бы просто не =FILTER(A1:A7,A1:A7<>"XX")
@Рори, в принципе да, но ОП хотел чего-то другого, а не просто ФИЛЬТР, я не уверен, каковы их намерения в будущем.
Достаточно справедливо, но я бы сказал, что было бы более привычно использовать в качестве критериев MAP.
REDUCE
REDUCE
вы часто будете использовать ""
в качестве первого аргумента, а в простых требованиях, подобных вашему, столбец (или строку) в качестве второго аргумента. ""
даст фиктивный первый результат и его следует удалить с помощью DROP
.LAMBDA
я использую rr
и r
для столбца, поскольку я просматриваю строки (или cc
и c
для строки, поскольку я просматриваю столбцы).rr
представляет текущий сложенный результат, а r
представляет значение в текущей строке.rr
) как есть (перепишите rr
) — в противном случае складывайте rr
и r
по мере необходимости.=LET(data,A1:A6,exclude,"XX",suffix,"%",
DROP(REDUCE("",data,LAMBDA(rr,r,
IF(r=exclude,rr,HSTACK(rr,r&suffix)))),,1))
LAMBDA-готовность
В данном конкретном случае я заменю LET
на LAMBDA
и удалю все аргументы в первой строке:
=LAMBDA(data,exclude,suffix,
DROP(REDUCE("",data,LAMBDA(rr,r,
IF(r=exclude,rr,HSTACK(rr,r&suffix)))),,1))
Затем я воспользуюсь этой формулой в диспетчере имен и создам имя, например. StackColumnH
чтобы иметь возможность использовать эту функцию LAMBDA в любом месте книги:
=StackColumnH(A1:A6,"XX","&")
Более эффективные способы удовлетворения требований (вряд ли актуально)
MS365
=LET(data,A1:A6,exclude,"XX",suffix,"%",
TOROW(IFS(data<>exclude,data&suffix),2))
Эксель 2021
=LET(data,A1:A6,exclude,"XX",suffix,"%",
TRANSPOSE(FILTER(data&suffix,data<>exclude)))
Мне нравятся фрагменты «Едва ли релевантные». +1
У вас поменялись аргументы в IF — это должно быть:
=REDUCE("",A1:A6,LAMBDA(init,cell,IF(cell = "XX",init,HSTACK(init,cell))))
, и вам нужно обернуть это в DROP, чтобы избавиться от первого пробела. Для дальнейшего использования размещение формулы в виде изображения на самом деле не поможет нам помочь вам. ;)