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


Кажется, это ошибка, хотя замена 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))))
но TAKE(a,-1) и @TAKE(a,-1) возвращают одно и то же, поэтому я не понимаю, почему первый не будет работать, а второй работает.
Потому что TAKE(a,-1) возвращает массив 1*1, а не одно значение. иногда это может вызвать проблемы в лямбде.
ну… массив 1x1 — это одно значение.
[""] = "" не будет хорошо работать ни на одном языке кодирования... оно будет работать только тогда, когда вы поместите [""] в диапазон Excel....
Например, у вас есть список строк, содержащий только один элемент, например {"a"}, затем у вас есть строка "a", это {"a"} просто отличается от "a". Я знаю это, потому что однажды проверял отладчик в среде расширенных формул Excel Lab. TAKE(a, 1, 1) — это массив 1*1, а INDEX(a, 1, 1) — это строка.
Я понимаю что ты имеешь ввиду. Это имеет смысл.
Не уверен насчет Windows, но на моем Mac всякий раз, когда я использую @TAKE()… он выдает предупреждение и предлагает некоторые изменения… поэтому в итоге я остановился на INDEX…
@rachel Такое же предупреждение появляется в Windows.
@ VBasic2008, я вижу. Он не только выдает предупреждения, но и меняет мою формулу. то есть он добавляет @ в другие части формулы. это главная причина, по которой я его избегаю...
Да, если только вы не выберете No (right arrow).
Это называется SINGLE() функция! Можно прочитать здесь
Еще один способ использования 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. Функция СОРТИРОВКА в вашем первом предложении становится для меня проблемой, так как я не хочу, чтобы буквы сортировались. Ваше второе предложение мне кажется более подходящим.
Спасибо за ответ. Приятно слышать, что второй вариант сработал нормально
Благодаря JvdV,
=LAMBDA(cur, LET(next, DROP(cur,1), TOCOL(HSTACK(cur, IF(cur<> next,"",NA())),2)))(A2:A10)
Я предпочитаю называть это плохим кодированием, а не ошибкой... Я заметил, что динамический массив в LAMBDA всегда непредсказуем. поэтому я почти всегда использую INDEX вместо TAKE или DROP в лямбда-выражении. потому что в индексе я могу контролировать размер массива, и результаты предсказуемы...