Всем доброго вечера,
У меня есть таблица в столбцах «А» и «Б». Он известен как спецификация (спецификация), а столбец «A» является родительским для дочернего столбца «B». В некоторых Кодексах есть дочерний элемент, который также может иметь дочерний элемент и т. д. и т. п., НО они не всегда имеют одинаковое количество уровней. В моем примере таблица A001 имеет двух дочерних элементов «A005» и «A006», каждый из которых имеет свой собственный дочерний элемент MCode. Однако у A002 нет дочернего Acode, а есть только дочерний «M002».
Я пробовал различные циклы преобразования таблицы в столбцах «A» и «B» в таблицу в столбцах от «D» до «G», но динамические уровни, на которые переходят дети, означают, что я просто не могу заставить ее работать. Некоторые исследования предполагают наличие рекурсивной функции, но я не могу ее реализовать, несмотря на различные попытки.
Любая поддержка приветствуется (не беспокоюсь о форматировании в столбцах от «D» до «G», но вставил ее для облегчения понимания). Если у вас есть какие-либо вопросы, которые помогут понять мою просьбу, я рад ответить на любой из них.
Большое спасибо, Алан.
Большое спасибо за предложение. К сожалению, варианты по ссылке не имеют особого смысла. Вариант 1 просто вызывает ошибки даже при прямом копировании и вставке. Вариант 2 у меня в голове, а вариант 3 — я понятия не имею, куда следует помещать функции. В общем, можно с уверенностью сказать, что я полностью заблудился.
Спасибо за интересный вызов (люблю рекурсию :)
Рекурсия в Excel имеет некоторые ограничения, но это может подойти для ваших нужд.
Определите именованную формулу (all_my_children
) в диспетчере имен (нам нужно использовать ее для рекурсивных формул) в примере, в котором я создал таблицу для данных с именем Tree
.
all_my_children=
=LAMBDA(p, DROP(REDUCE("r", p, LAMBDA(acc,cur, LET(c, FILTER(Tree[Child], Tree[Parent] = cur), VSTACK(acc, IF(AND(ISERROR(c)), cur, HSTACK(cur, VSTACK(all_my_children(c)))))))), 1))
=LAMBDA(p,
DROP(
REDUCE(
"r",
p,
LAMBDA(acc, cur,
LET(
c, FILTER(Tree[Child], Tree[Parent] = cur),
VSTACK(
acc,
IF(AND(ISERROR(c)), cur, HSTACK(cur, VSTACK(all_my_children(c))))
)
)
)
),
1
)
)
И затем, чтобы получить результат (введенный в примере E1
):
=LET(
first_level, UNIQUE(
FILTER(Tree[Parent], MAP(Tree[Parent], LAMBDA(a_, AND(a_ <> Tree[Child]))))
),
result, IFNA(all_my_children(first_level), ""),
VSTACK("Level " & SEQUENCE(, COLUMNS(result)), result)
)
Пожалуйста, дайте знать, если требуются какие-либо объяснения.
Просто потрясающе и подействовало! У вас есть что-нибудь типа «купи мне кофе», это огромно!
Приятно это слышать – спасибо за интересное испытание!
Хотя @nkalvi дал очень хороший ответ, вот мой результат по предыдущему вопросу:
используя Бомма
=IF(
COUNTIF(Range1, Parent) = 0,
hReplace({"", "", "", ""}, Level, Parent),
REDUCE(
hReplace({"", "", "", ""}, Level, Parent),
FILTER(Range2, Range1 = Parent),
LAMBDA(a, c, VSTACK(a, Bomm(c, Level + 1, Range1, Range2)))
)
)
и hReplace
=LET(seq, SEQUENCE(1, COLUMNS(array)), IF(seq = pos, with, array))
Отвечая на ваш вопрос, функции Bomm и hReplace должны быть определены в диспетчере имен, поэтому это выглядит так:
и это:
хотя на самом деле я использовал Advanced Formula Environment
В предыдущем вопросе было задано только четыре уровня, поэтому M0001 опущен в приведенных выше результатах. Вы можете легко модифицировать Бомма на пять уровней:
=IF(
COUNTIF(Range1, Parent) = 0,
hReplace({"", "", "", "", ""}, Level, Parent),
REDUCE(
hReplace({"", "", "", "", ""}, Level, Parent),
FILTER(Range2, Range1 = Parent),
LAMBDA(a, c, VSTACK(a, Bomm(c, Level + 1, Range1, Range2)))
)
)
Этот вопрос похож на: Сгладить иерархию родительских дочерних элементов в Excel (с использованием формулы или VBA). Если вы считаете, что это другое, отредактируйте вопрос, поясните, чем он отличается и/или как ответы на этот вопрос не помогают решить вашу проблему.