REDUCE с условным VSTACK внутри LAMBDA. Является ли это возможным?

Я пытаюсь построить VSTACK из динамического диапазона, используя REDUCE.

Что я получаю:

Что я хочу (обратите внимание, что значение XX игнорируется)

По сути, вопрос в том, как использовать условный HSTACK внутри LAMBDA внутри REDUCE. Здесь я хочу игнорировать ячейки со значением «XX» и создать динамическое разлив по HSTACK.

Я знаю, что мог бы просто использовать FILTER, но это всего лишь простой пример, где мне часто хочется выполнить более сложные условные изменения внутри сокращения в зависимости от значения ячейки, а затем HSTACK результатов (или игнорировать).

Я не понимаю, чем обусловлены значения #N/A.

HSTACK работает без условия, т.е. это работает (добавьте "%" и HSTACK):


1
50
3

Ответы:

Используйте FILTER() и TOROW(). Пытаться-

=TOROW(FILTER(A1:A100,(A1:A100<>"XX")*(A1:A100<>""))&"%")


У меня не получилось с ним работать REDUCE; но вместо этого я использовал MAP с FILTER, возможно, этого будет достаточно для ваших будущих проектов:

=FILTER(MAP(A1:A7;LAMBDA(a;IF(a = "xx";"";a)));A1:A7<>"xx")


Решено

Практика с функцией REDUCE

  • Думаю, Рори все сказал в твоих комментариях.
  • Мне нравится помещать входные данные в первую строку, чтобы формула была «готова к LAMBDA» (готова к преобразованию в функцию LAMBDA в диспетчере имен).
  • При использовании 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)))