Excel, цикл while с переменными циклами

Всем доброго вечера,

У меня есть таблица в столбцах «А» и «Б». Он известен как спецификация (спецификация), а столбец «A» является родительским для дочернего столбца «B». В некоторых Кодексах есть дочерний элемент, который также может иметь дочерний элемент и т. д. и т. п., НО они не всегда имеют одинаковое количество уровней. В моем примере таблица A001 имеет двух дочерних элементов «A005» и «A006», каждый из которых имеет свой собственный дочерний элемент MCode. Однако у A002 нет дочернего Acode, а есть только дочерний «M002».

Я пробовал различные циклы преобразования таблицы в столбцах «A» и «B» в таблицу в столбцах от «D» до «G», но динамические уровни, на которые переходят дети, означают, что я просто не могу заставить ее работать. Некоторые исследования предполагают наличие рекурсивной функции, но я не могу ее реализовать, несмотря на различные попытки.

Любая поддержка приветствуется (не беспокоюсь о форматировании в столбцах от «D» до «G», но вставил ее для облегчения понимания). Если у вас есть какие-либо вопросы, которые помогут понять мою просьбу, я рад ответить на любой из них.

Большое спасибо, Алан.

Этот вопрос похож на: Сгладить иерархию родительских дочерних элементов в Excel (с использованием формулы или VBA). Если вы считаете, что это другое, отредактируйте вопрос, поясните, чем он отличается и/или как ответы на этот вопрос не помогают решить вашу проблему.

P.b 26.07.2024 00:16

Большое спасибо за предложение. К сожалению, варианты по ссылке не имеют особого смысла. Вариант 1 просто вызывает ошибки даже при прямом копировании и вставке. Вариант 2 у меня в голове, а вариант 3 — я понятия не имею, куда следует помещать функции. В общем, можно с уверенностью сказать, что я полностью заблудился.

Alan Tingey 26.07.2024 14:05
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
2
2
101
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Спасибо за интересный вызов (люблю рекурсию :)

Рекурсия в 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)
)

Пожалуйста, дайте знать, если требуются какие-либо объяснения.

Просто потрясающе и подействовало! У вас есть что-нибудь типа «купи мне кофе», это огромно!

Alan Tingey 26.07.2024 17:23

Приятно это слышать – спасибо за интересное испытание!

nkalvi 26.07.2024 17:52

Хотя @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)))
    )
)

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