Функция REDUCE не может обрабатывать VSTACK с пробелом ("")

У меня есть вертикальный массив с буквами. Я хочу расширить его, чтобы при каждом изменении буквы вставлялась пустая строка.

Формула в зеленом диапазоне работает хорошо, за исключением того, что пустая строка не добавляется. Когда я добавляю пустую строку («» в первый VSTACK, в сером диапазоне), кажется, ничего не работает.

Добавление "" кажется мне очевидным, но не работает. Что мне не хватает?

Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
3
0
194
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

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

Кажется, это ошибка, хотя замена TAKE(a;-1) на @TAKE(a;-1) или INDEX(a;ROWS(a);1) работает нормально. *Credit to Elly

=REDUCE(;B3:B13;LAMBDA(a;b;IF(@TAKE(a;-1)=b;VSTACK(a;b);VSTACK(a;"";b))))

Я предпочитаю называть это плохим кодированием, а не ошибкой... Я заметил, что динамический массив в LAMBDA всегда непредсказуем. поэтому я почти всегда использую INDEX вместо TAKE или DROP в лямбда-выражении. потому что в индексе я могу контролировать размер массива, и результаты предсказуемы...

rachel 31.05.2024 05:11

но TAKE(a,-1) и @TAKE(a,-1) возвращают одно и то же, поэтому я не понимаю, почему первый не будет работать, а второй работает.

z.. 31.05.2024 07:20

Потому что TAKE(a,-1) возвращает массив 1*1, а не одно значение. иногда это может вызвать проблемы в лямбде.

rachel 31.05.2024 07:23

ну… массив 1x1 — это одно значение.

z.. 31.05.2024 07:26

[""] = "" не будет хорошо работать ни на одном языке кодирования... оно будет работать только тогда, когда вы поместите [""] в диапазон Excel....

rachel 31.05.2024 07:28

Например, у вас есть список строк, содержащий только один элемент, например {"a"}, затем у вас есть строка "a", это {"a"} просто отличается от "a". Я знаю это, потому что однажды проверял отладчик в среде расширенных формул Excel Lab. TAKE(a, 1, 1) — это массив 1*1, а INDEX(a, 1, 1) — это строка.

rachel 31.05.2024 07:31

Я понимаю что ты имеешь ввиду. Это имеет смысл.

z.. 31.05.2024 07:38

Не уверен насчет Windows, но на моем Mac всякий раз, когда я использую @TAKE()… он выдает предупреждение и предлагает некоторые изменения… поэтому в итоге я остановился на INDEX…

rachel 31.05.2024 07:42

@rachel Такое же предупреждение появляется в Windows.

VBasic2008 31.05.2024 11:14

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

rachel 31.05.2024 11:39

Да, если только вы не выберете No (right arrow).

VBasic2008 31.05.2024 12:20

Это называется SINGLE() функция! Можно прочитать здесь

Mayukh Bhattacharya 31.05.2024 14:08

Еще один способ использования OFFSET() + EXPAND():


=DROP(REDUCE(,B2:B12,LAMBDA(r,c,VSTACK(r,IF(c<>OFFSET(c,1,0),EXPAND(c,2,,""),c)))),-1)

CAVEAT:OFFSET() is a volatile function, hence will always keep recalculating whenever there is a change in any open workbook.


Или,

=DROP(DROP(REDUCE("",UNIQUE(B2:B12),LAMBDA(r,c,VSTACK(r,VSTACK(FILTER(B2:B12,B2:B12=c),"")))),1),-1)

Согласно комментариям ОП:

Спасибо, Маюх. Однако ваше решение не всегда работает. Например, если мой диапазон начинается с «a», «b», «z»… тогда «a» будет не отделяются от «б» пробелом, как следует, а остаются вместе вместо.



=DROP(DROP(REDUCE(,Z1:Z4,LAMBDA(r,c,VSTACK(r,IF(c<>OFFSET(c,1,0),EXPAND(c,2,,""),c)))),1),-1)

Добавить пробел между группами из разгруппированного столбца

=LET(data,A2:A11,
    u,UNIQUE(data),
    f,FILTER(data,data=TAKE(u,1)),
    IF(ROWS(u)=1,f,REDUCE(f,DROP(u,1),LAMBDA(rr,r,
        VSTACK(rr,"",FILTER(data,data=r))))))

  • Недавно я разместил аналогичный пост для нескольких колонок здесь.

Я вижу, что опоздал на вечеринку, но это хороший вопрос, так что я все равно добавлю свои два цента (без LAMBDA()):

Формула в B2:

=DROP(LET(x,A2:A12,IFNA(SORT(HSTACK(VSTACK(x,UNIQUE(x)),x)),"")),-1,1)

Или даже:

=DROP(TOCOL(HSTACK(A2:A12,IFS(A2:A12<>A3:A13,"")),3),-1)

Спасибо, JvdV. Функция СОРТИРОВКА в вашем первом предложении становится для меня проблемой, так как я не хочу, чтобы буквы сортировались. Ваше второе предложение мне кажется более подходящим.

vsoler 31.05.2024 16:42

Спасибо за ответ. Приятно слышать, что второй вариант сработал нормально

JvdV 31.05.2024 17:37

Благодаря JvdV,

=LAMBDA(cur, LET(next, DROP(cur,1), TOCOL(HSTACK(cur, IF(cur<> next,"",NA())),2)))(A2:A10)

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