Задача следующая. Есть простая таблица с двумя столбцами, строк примерно 5000:
столбец 1 - это ID Сотрудника
столбец 2 - это ID его Менеджера (Начальника)
Нужно заполнить 3й столбец - рядом с ID Менеджера заполнить ячейку Уровня подчиненности. У каждого Менеджера тоже есть свой как бы Начальник. Получается иерархия. Например: ID Менеджера = 14369 Листаем вниз, и видим что ID его Менеджера 11882 А у 11882 начальник 11881 и так далее....
Логику я вижу следующим образом:
Берем содержимое ячейки В2. Далее проверяем весь столбец А, находим там значение ячейки В2. Допустим это некая ячейка А"Х". Смотрим значение В"Х", и снова проверяем весь столбец А на наличие в нем В"Х". Получается несколько циклов, пока не выдаст ошибку что в столбце А такого значения нет. Для каждого значения столбца В мы посчитаем количество таких циклов, это и будет искомый уровень.
Получается что в 3й столбец нужно занести некое число, которое будет равняться количеству циклов... Я полагаю это делается макросом, а может можно и без него? Какие у вас мысли?
Еще одна вещь, которая поможет - у меня к каждому Менеджеру есть число его прямых подчиненных, таким образом цикл возможно, если получится, как-то ограничить этим числом.
Sub tttt()
Dim a, b, i&, k&, t$
a = [a1].CurrentRegion.Value
With CreateObject("Scripting.Dictionary")
For i = 2 To UBound(a)
t = Trim(a(i, 1))
.Item(t) = Trim(a(i, 2))
Next
For i = 2 To UBound(a)
k = 0: t = Trim(a(i, 2))
Do
If .exists(t) Then
k = k + 1: t = .Item(t)
Else
t = ""
End If
Loop While Len(t)
a(i, 3) = k
Next
End With
[a1].CurrentRegion.Value = a
End Sub
Подогнал Ваш файл под код (писал по рисунку), проверил по первому подчинённому - правильно.
Kivrus написал: А о чем вы с Hugo что насчет нуля переписывались?
Не берите в голову, это мы счетчик сообщений инкрементим. :-) , а серьезно, то или =IF(B2="NO_MANAGER";"";INDEX(D:D;MATCH(B2;A:A;0))+1) или =IF(B2="NO_MANAGER";0;INDEX(D:D;MATCH(B2;A:A;0))+1) или =IF(B2="NO_MANAGER";;INDEX(D:D;MATCH(B2;A:A;0))+1) я ноль в кавычки случайно вставил.
Kivrus, только надо последний аргумент добавить 0. Но мне казалось, что ругалось на рекурсивную ссылку. Сейчас проверил , все ок =IF(B4="NO_MANAGER";;VLOOKUP(B4;A:D;4;0)+1)
БМВ,да, именно так и делал...с 0 в конце все ОК Эх, снова рекурсия.... постоянно на нее натыкаюсь. Пока С изучал то замаялся чтобы разобраться в снежинке Коха... и тут опять.
Kivrus, Ну скажем так, рекурсия рекурсии рознь. Если в программах рекурсия позволяет крохотным кодом обсчитать огромные объёмы, то в таблице это зацикливание и ошибка, да и то правильное использование итерации позволяет очень эффективно подбор делать даже в таблицах.
sokol92, красоты нет, прозаично все, хотя и неожиданно рабочее :-).