2016-01-12 3 views
2

В настоящее время у меня есть лист в excel с отступом иерархии элементов, как показано ниже.
Каждый элемент имеет отступы (четыре пробела на отступ), чтобы показать, как он вписывается в общую иерархию.
Мне удалось создать столбец «Уровень», который переводит уровень отступа в число.Как найти родителя в иерархии с отступом?

+------------+-------+--------+ 
    | Item | Level | Parent | 
    +------------+-------+--------+ 
    | P1   |  1 | N/A | 
    |  P2  |  2 | P1  | 
    |  P3  |  2 | P1  | 
    |   P4 |  3 | P3  | 
    |  P5  |  2 | P1  | 
    |   P6 |  3 | P5  | 
    +------------+-------+--------+ 

То, что я хочу сделать, это сгенерировать столбец «Родитель» выше, который использует «уровень» информацию для отображения родителя каждого элемента.
Я думаю, что это нужно будет сделать с помощью цикла, который будет делать это для каждого элемента X:

-Find level info for X 
    -Find (levelx-1) which would equal the parent item's level 
    -Search upward for the first row with a level equal to (levelx-1) 
    -Find the item number in that row 
    -Write item number in adjacent cell to X 

К сожалению, я не знаю, как перевести эту идею в VBA.
Заранее благодарим за любую помощь.

+0

Чтобы уточнить, решение не обязательно должно быть VBA. На самом деле было бы лучше, если бы это было не так. – t0ucansam

+0

[Обратное совпадение] (http://stackoverflow.com/questions/14189085/excel-reverse-match) может помочь. При этом у вас будет номер строки, который может использоваться в формуле индекса для получения желаемого результата. Дайте мне минуту ... – vacip

ответ

2

ОК, предполагая, приведенную выше таблицу начинается в ячейке A1, полезные данные начинается в строке 2. Эта формула будет делать трюк:

=INDEX($A$1:$A$7,MAX(IF($B$2:$B2=B2-1,ROW($B$2:$B2),""))) 

Введите это в ячейке C2 как формулу массива (Ctrl + Shift + Enter), затем вытащите его. Первым, очевидно, будет ошибка (не #NA, а #VALUE).

Как это работает:

IF($B$2:$B2=B2-1,ROW($B$2:$B2),"") 

Это создает массив с номерами строк для значений с один уровень ниже, чем фактическое значение. Чтобы проверить только значения выше текущей строки, вам нужно использовать расширяющиеся диапазоны, следовательно, ссылки на стиль $B$2:$B2.

Функция MAX получает максимум этих строк, который наиболее близок к нашей текущей ячейке. Теперь у нас есть номер строки. Все, что нам нужно сейчас, это формула для извлечения данных из столбца A из указанной строки. Это то, что делает INDEX.

+0

Большое спасибо за ваше решение и подробное объяснение! – t0ucansam

0

Мне потребовалось некоторое время, чтобы понять, как эта формула работает, поэтому, выяснив ее (хорошо, моя жена немного помогла мне), я хотел бы поделиться идиотическими объяснениями других подобных мне манекенов Excel. Здесь мы идем:

=INDEX($A$1:$A$7,MAX(IF($B$2:$B2=B2-1,ROW($B$2:$B2),""))) 

означает:

  1. Среди значений в диапазоне $B$2:$B2 найти все значения, которые равны B2-1.
  2. Если вы нашли их, перечислите номера строк со значением, равным B2-1. (ROW)
  3. Из списка номеров строк выберите наивысший номер строки (позвоните по номеру X). (MAX)
  4. Возвращает значение, которое находится в строке номер X в диапазоне $A$1:$A$7

    (Внимание! Ваш диапазон должен начать в строке нет. 1, так что номер строки является таким же, как номер строки в вашем диапазоне. В противном случае - вам нужно приспособить формулу.)

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