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

=LET(rng;B2:B5;col;TOCOL(TEXTSPLIT(TEXTJOIN(",";TRUE;rng);",";;TRUE;TRUE)); TEXTJOIN(",";;TOCOL(IF(BYROW(UNIQUE(col);LAMBDA(x;SUM(--(x=col))))=ROWS(rng);UNIQUE(col);1/0);3))
Я пытался использовать формулу If с чем-то вроде =IF ( A2<>A3; ... ), но я не думаю, что это правильный путь, и я не знаю, как использовать VBA и макросы.


Я только что заменил ваш LET(rng,B2:B5, на LET(rng,FILTER(Table1[Column2],Table1[Teams]=A2), и обернул его формулой IF, чтобы она заполнялась только в том случае, если команда отличается от предыдущей строки.
Обратите внимание, что я использую , вместо ; для разделения аргументов.
=IF(A2<>A1,LET(rng,FILTER(Table1[Column2],Table1[Teams]=A2), col,TOCOL(TEXTSPLIT(TEXTJOIN(",",TRUE,rng),",",,TRUE,TRUE)), TEXTJOIN(",",,TOCOL(IF(BYROW(UNIQUE(col),LAMBDA(x,SUM(--(x=col))))=ROWS(rng),UNIQUE(col),1/0),3))),"")
Чтобы сделать это более гибким, я бы изменил IF(A2<>A1 на IF(COUNTIF($A$2:A2;A2)=1. Таким образом, если, например, A3 изменится на 3, оно не будет повторяться в следующий раз, когда появится 1 или 3.
Я бы выбрал следующий подход:
TextSplit()).Unique(), чтобы найти уникальные идентификаторы).CountIf() в каждом из TextSplit-ted массивов.CountIf() функций. Если это соответствует общему количеству строк, вы нашли запись, которая существует в каждой ячейке.Что касается объединения, я могу «объединять» только строки, поэтому я провел следующий эксперимент: поместил «1,2,3,4,5» в ячейку «B1» и «2,3». ,4,5,6" в ячейке "B2" и используйте следующую формулу:
=UNIQUE(TEXTSPLIT(TEXTJOIN(",";TRUE;B1;B2);","))
Как видите, идея заключалась в следующем:
Это должно было быть [1, 2, 3, 4, 5, 6], но на моем компьютере это дает [1, 2, 3, 4, 5, 2, 3, 4, 5, 6].
Хотя мои результаты ошибочны, я совершенно уверен, что мой подход верен.
Может быть, кто-то с лучшим знанием Excel сможет это исправить?
Если вы хотите использовать UNIQUE таким образом, вам следует TEXTSPLIT выделять строки, а не столбцы. Просто добавьте дополнительный пробел, например:=UNIQUE(TEXTSPLIT(TEXTJOIN(",",TRUE,B1,B2),,","))
Вот немного более обобщенная версия (с использованием Microsoft 365).
Основная логика (очень похожа на предложения выше)
Как вы можете видеть в примере, это не зависит от упорядочивания по номеру команды.
common_values_for_team
= LAMBDA(
team_number,
LET(
teams_values,
unique_values_for_team(team_number),
IF(ROWS(teams_values) = 1,
teams_values,
REDUCE(,teams_values,
LAMBDA(
acc,
row,
TEXTJOIN(
col_delim,,
intersection_a_b(
TEXTSPLIT(acc, col_delim), TEXTSPLIT(row, col_delim))))))))
intersection_a_b получить общие значения в двух строках (уникальные(комбинированные) — один раз)
= LAMBDA(a,b,
LET(
ab,
HSTACK(a, b),
u,
UNIQUE(ab, TRUE),
once,
UNIQUE(ab,TRUE,TRUE),
is_common,
ISNA(MATCH(u,once,0)),
FILTER(u,is_common,"none")))
unique_values_for_team (получите уникальные значения для команды в одном столбце)
=LAMBDA(n, unique_values_as_delim_text(split_col_to_numbers(team_values(n))))
unique_values_as_delim_text (конвертировать строки и столбцы со значениями в один столбец)
=LAMBDA(area,BYROW(area,LAMBDA(row,TEXTJOIN(col_delim,,UNIQUE(row,TRUE)))))
Другие функции и переменные:
= ","
row_delim
= "|"
Split_col
=LAMBDA(single_col,TEXTSPLIT(TEXTJOIN(row_delim,,single_col), col_delim,row_delim))
Split_col_to_numbers
=LAMBDA(col,IFNA(VALUE(TRIM(split_col(col))),""))
команда_значения
=LAMBDA(number,FILTER(Table1[Column2], Table1[Teams]=number))Пример данных и результат (таблица команд определяется как Table1)
=SORT(UNIQUE(Table1[Teams]))=BYROW(E2#,LAMBDA(number,common_values_for_team(number)))
Большое спасибо, это будет полезно