Создание динамического массива, который суммирует разные столбцы в зависимости от строки

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

например в строке 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),","))))) 

кажется, что в каждом случае он берет первый столбец, на который ссылаются, т.е. первый и пятый соответственно.

Эй, ведь FILTER > Логический массив, высота или ширина которого такая же, как у массива. Пожалуйста, проверь это.

nkalvi 02.07.2024 15:51

Если предположить, что N5 — опечатка, то TAKE или CHOOSECOLS «отыгрываются». Не знаю почему. Вместо этого вы можете использовать INDEX: =BYROW(FILTER(A2:M3,N2:N3 = "yes"),LAMBDA(α,SUM(CHOOSECOLS(DRO‌​P(α,,1),--TEXTSPLIT(‌​INDEX(α,1),","))))). @Mayukh Bhattacharya У тебя есть какие-нибудь подсказки?

VBasic2008 02.07.2024 16:22

@VBasic2008, TAKE, похоже, виноват.

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

Ответы 2

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

Попробуйте использовать следующую формулу:


    =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 02.07.2024 21:22

@JvdV Сэр, да, это работает. =BYROW(FILTER(A2:M4,N2:N4 = "Yes"),LAMBDA(α,SUM(CHOOSECOLS(α,T‌​EXTSPLIT(@α,",")+1))‌​)) Спасибо большое за советы!!!

Mayukh Bhattacharya 02.07.2024 21:24

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 02.07.2024 16:46

@ VBasic2008 Сэр, то, что вы использовали, в основном называется SINGLE() или @ --> Implicit Intersection Operator и, следовательно, почему оно работает! Когда вы используете то же самое внутри BYROW(), он проверяет каждую строку и принимает верхнее левое значение, тогда как при использовании INDEX(α,,1) или TAKE(α,,1) это не будет работать, так как будет разделяться только и давать первые значения разделения, а не все!

Mayukh Bhattacharya 02.07.2024 17:11

@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

nkalvi 02.07.2024 17:59

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