Как я могу обновить эту формулу, чтобы она работала для всех столбцов справа, а не только для текущих 2, для которых она настроена?

У меня есть вкладка «История группы», где я записываю, в какую группу попал каждый ученик. скриншот содержимого вкладки «История группы» На другой вкладке под названием «Матрица истории» мне удалось успешно подсчитать, сколько раз каждый ученик был в группе с другим учеником, и я смог перетащить маркер, чтобы динамически обновлять его для других ячеек. скриншот содержимого вкладки «Матрица истории» Проблема в том, что в настоящее время это настроено для работы только с этими двумя столбцами дат, и мне пришлось бы обновить формулу для будущих дат, и это стало бы утомительным. Кроме того, в том виде, в каком он сейчас написан, если я удалю какие-либо столбцы до N, это приведет к сбою, потому что в некоторых формулах используется ДВССЫЛ, который упоминает имена этих столбцов в виде строкового текста и фактически не соединяет столбцы для динамического обновления. с ними. Вот формула, которая сейчас находится в ячейке B3 матрицы истории: =IF(B$2=$A3, "x", SUM((--('Group History'!$N3=INDIRECT("Group History!$N"&COLUMN(B$2)+1))) + (--('Group History'!$O3=INDIRECT("Group History!$O"&COLUMN(B$2)+1)))))Ссылка для просмотра таблицыСсылка для копирования

Я пробовал

Какое приложение вы используете: Таблицы или Excel? Если Excel, то какой версии?

bugdrown 05.09.2024 08:45

Спасибо, что поделились копией данных — это очень удобно.

nkalvi 05.09.2024 15:53

Если вы замените летучий INDIRECT на INDEX, вы получите вот это =IF(B$2=$A4,"x",SUM((--('Group History'!$N4=INDEX('Group History'!$N:$N,COLUMN(B$2)+1)))+(--('Group History'!$O4=INDEX('Group History'!$O:$O,COLUMN(B$2)+1))))). Дает ли это ожидаемый результат?

VBasic2008 05.09.2024 16:06
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
60
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Предполагая, что обе ваши таблицы начинаются с ячейки A1, в 'Group History'!B2 введите:

 =IF($A2<>B$1,SUMPRODUCT((XLOOKUP($A2,'Group History'!$A$3:$A$28,'Group History'!$B$3:$S$28, 0,0)=XLOOKUP(B$1,'Group History'!$A$3:$A$28,'Group History'!$B$3:$S$28,0,0))*(XLOOKUP($A2,'Group History'!$A$3:$A$28,'Group History'!$B$3:$S$28, 0,0)<>"")),"x")

и скопируйте формулу вниз и вправо.

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

Чтобы отменить поворот данных, выберите «Вставка» > «Лист», назовите новый лист Unpivot и поместите эту формулу в ячейку A1:

=let( 
  unpivot_, lambda(data, numFixedCols, numColsPerGroup, let(k,n(numFixedCols),d,if (k,data,hstack(sequence(rows(data)),data)),f,if (k,k,1),g,numColsPerGroup,s,lambda(r,c,h,w,chooserows(choosecols(d,sequence(1,w,c)),sequence(h,1,r))),h,hstack(s(1,1,1,f),"Date","GroupID"),i,sequence(1,(columns(d)-f)/g,f+1,g),a,reduce(h,sequence(rows(d)-1,1,2),lambda(a,r,let(x,s(r,1,1,f),b,reduce(tocol(æ,2),i,lambda(y,c,let(z,s(r,c,1,g),if (""=+z,y,vstack(y,hstack(x,s(1,c,1,1),z)))))),vstack(a,b)))),if (k,a,choosecols(a,sequence(1,columns(a)-1,2))))), 

  unpivot_('Group History'!A2:ZZ, 1, 1) 
)

Это будет работать до столбца ZZ, но при необходимости вы можете пройти до ZZZ.

Чтобы получить матрицу, вставьте еще один лист и поместите туда эту формулу:

=let( 
  students, tocol('Group History'!A3:A, 1), 
  data, filter(Unpivot!A2:C, len(Unpivot!A2:A)), 
  names, choosecols(data, 1), 
  dates, choosecols(data, 2), 
  groupIds, choosecols(data, 3), 
  matrix, map(students, lambda(s, let( 
    d, filter(dates, names = s), 
    i, filter(groupIds, names = s), 
    inSameGroup, filter(names, match(dates & groupIds, d & i, 0)), 
    counts, query(inSameGroup, "select Col1, count(Col1) group by Col1", 0), 
    row, arrayformula(ifna(vlookup( 
      torow(students), counts, 2, false 
    ))), 
    arrayformula(if (torow(students) = s, "x", row)) 
  ))), 
  vstack( 
    hstack( 
      "in the same group on the same date", 
      torow(students) 
    ), 
    hstack(students, matrix) 
  ) 
)

screenshot

Видеть let(), лямбда(), карта(), vstack(), hstack(), selectcols(), фильтр(), vlookup(), match(), arrayformula(), запрос(), torow() и tocol().

Отредактирован ответ, чтобы ограничить результаты именами в одной группе в одну и ту же дату.

doubleunary 05.09.2024 18:49
Ответ принят как подходящий

С Microsoft 365 вы можете попробовать следующее:

=LET(
    students, 'Group History'!A3:A28,
    grp_assigned, 'Group History'!B3:AD28,
    num_students, ROWS(students),
    st_indices, SEQUENCE(num_students),
    num_shared, LAMBDA(x, y,
        IF(
            x = y,
            "x",
            SUM(
                --BYCOL(
                    CHOOSEROWS(grp_assigned, x, y),
                    LAMBDA(c, IF(SUM(--(LEN(TRIM(c)) = 0)), 0, ROWS(UNIQUE(c)) = 1))
                )
            )
        )
    ),
    history_matrix, MAKEARRAY(num_students, num_students, num_shared),
    HSTACK(VSTACK("", students), VSTACK(TOROW(students), history_matrix))
)

Результат:

Итерация двух строк (студентов) за раз, а затем по каждому столбцу (дата):

  • Установите количество столбцов = 0, если есть пробелы SUM(--(LEN(TRIM(c)) = 0))
  • Если поделиться, уникальное количество будет равно 1 ROWS(UNIQUE(c)) = 1

Пожалуйста, скорректируйте диапазон B3:AD28 в соответствии с возможными будущими записями.


Google Таблицы

Кажется, работает с некоторыми корректировками:

  • в BYCOL, с --(ROWS(UNIQUE(c)) = 1)
  • чтобы проверить пустые строки sum(--byrow(c, lambda(a, len(trim(a)) = 0)))
=LET(
    students, 'Group History'!A3:A28,
    grp_assigned, 'Group History'!B3:AD28,
    num_students, ROWS(students),
    st_indices, SEQUENCE(num_students),
    num_shared, LAMBDA(x, y,
        IF(
            x = y,
            "x",
            SUM(
                BYCOL(
                    CHOOSEROWS(grp_assigned, x, y),
                    LAMBDA(c, IF(sum(--byrow(c, lambda(a, len(trim(a)) = 0))), 0, --(ROWS(UNIQUE(c)) = 1)))
                )
            )
        )
    ),
    history_matrix, MAKEARRAY(num_students, num_students, num_shared),
    result, HSTACK(VSTACK("", students), VSTACK(TOROW(students), history_matrix)),
result
)

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