Я хотел бы суммировать столбцы, но суммируемые столбцы будут разными в каждой строке в зависимости от ячейки в этой строке.
например в строке 1 я хочу суммировать столбцы 1,2,3,4, но во второй строке я хочу суммировать 5,6,7,8,9,10,11 и 12
Мне был предоставлен предыдущий ответ, который работает с диапазоном
=BYROW(A2:M3,LAMBDA(α,SUM(CHOOSECOLS(DROP(α,,1),--TEXTSPLIT(TAKE(α,,1),",")))))
, но не массив:
=BYROW(FILTER($a$2:$m$3,$n$2:$n$5 = "yes"),LAMBDA(α,SUM(CHOOSECOLS(DROP(α,,1),--TEXTSPLIT(TAKE(α,,1),",")))))
кажется, что в каждом случае он берет первый столбец, на который ссылаются, т.е. первый и пятый соответственно.
Если предположить, что N5
— опечатка, то TAKE
или CHOOSECOLS
«отыгрываются». Не знаю почему. Вместо этого вы можете использовать INDEX
: =BYROW(FILTER(A2:M3,N2:N3 = "yes"),LAMBDA(α,SUM(CHOOSECOLS(DROP(α,,1),--TEXTSPLIT(INDEX(α,1),",")))))
. @Mayukh Bhattacharya У тебя есть какие-нибудь подсказки?
@VBasic2008, TAKE
, похоже, виноват.
Попробуйте использовать следующую формулу:
=TOCOL(BYROW(A2:N4,LAMBDA(α,
SUM(CHOOSECOLS(FILTER(DROP(α,,-1),TAKE(α,,-1) = "Yes"),
--TEXTSPLIT(TAKE(α,,1),",")+1)))),2)
Вам не нужен INDEX()
или TAKE()
, чтобы ваша формула работала, вот быстрое решение: Решение, предложенное на основе моего более раннего решения для ОП.
• Использование SINGLE()
--> @
=BYROW(FILTER(A2:M4,N2:N4 = "Yes"),LAMBDA(α,
SUM(CHOOSECOLS(DROP(α,,1),--TEXTSPLIT(@α,",")))))
Причина, по которой SINGLE()
или @
будут работать, заключается в том, что при использовании массива FILTER()
внутри BYROW()
последний проверяет каждую строку и принимает верхнее левое значение из массива, используя SINGLE()
или @
, который обычно называется Implicit Intersection Operator
, и вы можете прочитать подробнее о его использовании в диапазоне, ячейке или массиве здесь.
Вышеупомянутое относится и к TAKE()
, что, безусловно, будет работать, если @
добавлено перед TAKE()
, однако это не требуется при использовании внутри BYROW()
=BYROW(FILTER(A2:M4,N2:N4 = "Yes"),LAMBDA(α,
SUM(CHOOSECOLS(DROP(α,,1),--TEXTSPLIT(@TAKE(α,,1),",")))))
Относится к тому же в приведенном выше контексте:
SINGLE(α)
@α
INDEX(α,1)
@TAKE(α,,1)
@INDEX(α,,1)
Как предложил в комментариях ниже JvdV Сэр:
=BYROW(FILTER(A2:M4,N2:N4 = "Yes"),LAMBDA(α,SUM(CHOOSECOLS(α,TEXTSPLIT(@α,",")+1))))
Или,
=BYROW(FILTER(A2:M4,N2:N4 = "Yes"),LAMBDA(α,SUM(INDEX(α,TEXTSPLIT(@α,",")+1))))
LAMBDA()
часть также можно записать так: LAMBDA(α,SUM(CHOOSECOLS(α,TEXTSPLIT(@α,",")+1))
для сохранения функции. Однако мне нравится использовать INDEX()
и здесь вместо CHOOSECOLS()
. Я просто к этому привык, наверное...
@JvdV Сэр, да, это работает. =BYROW(FILTER(A2:M4,N2:N4 = "Yes"),LAMBDA(α,SUM(CHOOSECOLS(α,TEXTSPLIT(@α,",")+1))))
Спасибо большое за советы!!!
TAKE
был причиной вашей (и моей — видел это много раз, поэтому я склонен использовать INDEX
) проблемы (может быть ошибка в Excel).
=LAMBDA(data, criteria,
LET(
filtered, FILTER(data, criteria),
BYROW(
filtered,
LAMBDA(row_,
SUM(
CHOOSECOLS(
DROP(row_, , 1),
--TEXTSPLIT(
INDEX(row_, 1, 1),
","
)
)
)
)
)
)
)(A2:M4, N2:N4 = "yes")
Но как объяснить, что CHOOSECOLS
тоже не работает? Кроме того, посмотрите на решение Маюха, которое имеет то же самое TAKE
, но работает.
@ VBasic2008 Сэр, то, что вы использовали, в основном называется SINGLE()
или @
--> Implicit Intersection Operator
и, следовательно, почему оно работает! Когда вы используете то же самое внутри BYROW()
, он проверяет каждую строку и принимает верхнее левое значение, тогда как при использовании INDEX(α,,1)
или TAKE(α,,1)
это не будет работать, так как будет разделяться только и давать первые значения разделения, а не все!
@VBasic2008, TAKE
+ TEXTSPLIT
, похоже, действует неожиданным образом, если не используется с диапазоном. Попробуйте, например: =LET(arr, {"1,2","3,4"}, a_range, F15:G15, VSTACK(TEXTSPLIT(TAKE(a_range, 1, 1), ","), TEXTSPLIT(TAKE(arr, 1, 1), ","), TEXTSPLIT(INDEX(arr, 1, 1), ",")))
где F15:G15
есть 1,2 3,4
Эй, ведь
FILTER
> Логический массив, высота или ширина которого такая же, как у массива. Пожалуйста, проверь это.