2012-04-12 4 views
4

У меня есть лист Excel, который выглядит следующим образом:Как рекурсивно добавлять ячейки?

|A  B   C      D 
----------------------------------------------------------------------------------- 
1 |ID PARENTID VALUE     RESOLVED VALUE (how to generate this?) 
=================================================================================== 
2 |0  0   /root     /root 
3 |1  0   /one     /root/one 
4 |2  0   /two     /root/two 
5 |3  0   /three     /root/three 
6 |4  3   /child-one-of-three /root/three/child-one-of-three 
7 |5  3   /child-two-of-three /root/three/child-two-of-three 

Каждая строка имеет ID и PARENTID. Я хочу сгенерировать содержимое последнего столбца, RESOLVED VALUE, путем resursively добавления VALUE каждой строки.

Как это сделать в Excel?

+0

Если 'PARENTID' для ID = 1 равен 0, а? В противном случае ни одно из разрешенных значений не вернется к '/ root'. – Excellll

+0

@Excellll Ты чертовски прав. Исправлено сейчас. – adarshr

+0

Готовы ли вы к решению VBA? Я уверен, что это можно сделать только со встроенными функциями листа, если вы знаете максимальную глубину своего дерева. – Excellll

ответ

3

Предполагая, что данные начинаются в ячейке A3:

=IF(B4=A4,C4,VLOOKUP(B4,$A$3:$D$5,4)&C4) 

Вы должны расширить $A$3:$D$5 до размера вашего массива данных.

+0

Будет ли это достаточно динамичным, чтобы добавить несколько уровней? Я имею в виду, может ли он строить такие значения, как '/ root/three/child/grandchild'? – adarshr

+0

Должно быть. Он принимает полный путь родительского идентификатора (который был построен таким же образом) и добавляет текущее 'значение' до конца. Обратите внимание, что ваши записи должны быть отсортированы с помощью 'ID' для обеспечения правильной работы' VLOOKUP'. – Marc

+0

Но я не понимаю, как в выражении есть только один символ '&'. – adarshr

1

Это решение функции VBA.

Option Explicit 
Public Function ResValue(id As Long, table As Range, indexID As Integer, indexParentID As Integer, indexValue As Integer) As String 

Dim strTmp As String, idTmp As Long 
idTmp = id 
ResValue = "" 
Do While idTmp <> 0 
    strTmp = Application.WorksheetFunction.Index(table.Columns(indexValue), Application.WorksheetFunction.Match(idTmp, table.Columns(indexID), 0)) 
    ResValue = strTmp & ResValue 
    idTmp = Application.WorksheetFunction.Index(table.Columns(indexParentID), Application.WorksheetFunction.Match(strTmp, table.Columns(indexValue), 0)) 
Loop 
ResValue = Application.WorksheetFunction.Index(table.Columns(indexValue), Application.WorksheetFunction.Match(0, table.Columns(indexID), 0)) & ResValue 
End Function 

Вы можете использовать ResValue(id, table, indexID, indexParentID, indexValue) на листе для того чтобы сгенерировать разрешенные значения.

Примечания:

  • id это идентификатор вы хотите создать разрешенное значение.
  • table - адрес всей таблицы (исключая столбец разрешенных значений).
  • Каждый индексный индекс является относительным индексом столбца для каждого поля. Например, идентификаторы в первом столбце таблицы, так indexID = 1, и ParentIDs находятся во второй колонке, так indexParentID = 2.

В вашем примере таблицы, вы должны ввести следующее в D3 (первая ячейка для разрешенных значений):

=ResValue(A3,$A$3:$C$8,1,2,3) 

И после этого вы можете заполнить эту формулу по столбцу.

enter image description here

+0

Спасибо за сценарий. Хотя он и пытается делать что-то, я считаю, что он разрешает значение для строк 4, 5 и далее как «/ root/one/two», '/ root/one/two/three' и т. Д. То есть, это просто добавление предыдущего значения вместо рассмотрения его родителя. Что я могу делать неправильно? – adarshr

+0

Проверьте захват экрана, который я разместил. Обратите внимание, что при редактировании исходного сообщения, чтобы показать ParentID из 1 как 0 (вместо 1), он изменил разрешенные значения для всех идентификаторов, которые следуют. Может быть, вы просто поспешно увидели образец, которого там не было? Уверяю вас, эта функция отлично работает на моей машине. – Excellll

+0

О да, действительно. У меня ошибка в моих данных. Я отредактирую таблицу, чтобы отразить это. Спасибо за отличное решение. – adarshr

Смежные вопросы