Консультация № 189396
17.05.2016, 12:36
0.00 руб.
0 15 1
Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос:

Здравствуйте! У меня возникли сложности с таким вопросом:

У меня есть файл экмель
там два столбца, в одном айди сотрудников, во втором айди их начальников, мне нужно выстроить структуру подчинености

то есть сколько уровней от высшего до низшего и кто на каком уровне
пример данных такой (для наглядности)

00610 СД
00641 00610
00536 00610
02063 00610
00615 00610
00175 00610
00135 00610
00022 00610
00523 00610
00612 00641
00591 00612
3319 00523
17546 13809
13809 00022
00535 13809

и таких строк 3000

Обсуждение

давно
Модератор
137394
1850
17.05.2016, 13:26
общий
17.05.2016, 13:30
Peachpuncher, Какой айди самого главного начальника?
Об авторе:
Понеже не словес красных бог слушает, но дел наших хощет
давно
Посетитель
400336
8
17.05.2016, 13:31
общий
Самого главного СД
давно
Модератор
137394
1850
17.05.2016, 16:40
общий
Peachpuncher, Неплохо бы получить Ваш файл полностью.
Об авторе:
Понеже не словес красных бог слушает, но дел наших хощет
давно
Посетитель
400336
8
17.05.2016, 17:05
общий
Парни файл выгрузить к сожалению не получится из-за супер жестких требований о конфиденциалньости

максимум могу перешифровать там все
все цифры заменить на буквы и так отправить
и то сообщением, нам нельзя ничего выгружать
давно
Модератор
137394
1850
17.05.2016, 22:54
общий
это ответ
Здравствуйте, Peachpuncher! В приложении текст макроса, который выстраивает структуру подчинённости. Таблица с Вашим примером и макросом для формирования иерархии Опасаюсь, что не очень понимаю задачу и, скорее всего, в Вашей таблице более двух столбцов, поэтому решение не очень подойдёт - но тут уж будет Ваша вина - не точно поставили задачу. Будем дорабатывать

Приложение:
Sub rrr()

Boss1 = "СД" ' айди самого большого начальника
First = "A1" ' адрес первой клетки с данными

Dim Mas As Variant

RAll = First + ":" + Replace(Range(First).End(xlDown).Offset(0, 1).Address, "$", "")
Range(RAll).NumberFormat = "@"

Mas = Range(RAll)
N1 = LBound(Mas, 1)
N2 = UBound(Mas, 1)
M1 = LBound(Mas, 2)
M2 = UBound(Mas, 2)

ReDim Index(N1 To N2, M1 To M2)
For i = N1 To N2
For j = M1 To M2
Mas(i, j) = CStr(Mas(i, j))
Next
Next

k = 0
L = 1
For i = N1 To N2
If Mas(i, M2) = Boss1 Then
k = k + 1
Index(i, M1) = CStr(k)
Index(i, M2) = L
Else
Index(i, M2) = 0
End If
Next

Logika = True
Do While Logika
Logika = False
For i = N1 To N2
If Index(i, M2) = L Then
KBoss = Mas(i, M1)
Ier = Index(i, M1)
k = 0
For ii = N1 To N2
If Mas(ii, M2) = KBoss Then
k = k + 1
Index(ii, M1) = Ier + "." + CStr(k)
Index(ii, M2) = L + 1
Logika = True
End If
Next
End If
Next
L = L + 1
Loop

For i = N1 To N2
For j = i To N2
If Index(j, M1) < Index(i, M1) Then
P = Index(i, M1)
Index(i, M1) = Index(j, M1)
Index(j, M1) = P

P = Mas(i, M1)
Mas(i, M1) = Mas(j, M1)
Mas(j, M1) = P

P = Mas(i, M2)
Mas(i, M2) = Mas(j, M2)
Mas(j, M2) = P

End If
Next
Range(First).Offset(i - N1, 2).NumberFormat = "@" ' !!!!!!!!!!!!!!!!!!
Range(First).Offset(i - N1, 2) = Index(i, M1) ' !!!!!!!!!!!!!!!!!!
Next

Range(RAll) = Mas

End Sub
Об авторе:
Понеже не словес красных бог слушает, но дел наших хощет
давно
Посетитель
400336
8
18.05.2016, 10:16
общий
23.05.2016, 16:23
извиняюсь еще не успел протестить, но из того примера что видел меня смутила одна вещь

Там две позции под СД - 00610 и 00641 - они обе на втором уровне иеррархии получаются
а у вас согласно коду выходит что один выше другого
давайте я вам кину изначальный вариант в сообщении прямо
может быть когда данных больше ввам будет легче написать
давно
Модератор
137394
1850
18.05.2016, 10:50
общий
18.05.2016, 10:53
Адресаты:
А Вы Определитесь, что такое иерархия и в каком виде вы хотите её видеть. Главный босс СД. В примере ему напрямую подчиняются 2 человека (641 и 610) на одном уровне иерархии, номера по порядку 1 и 2. Человеку 610 подчиняются напрямую 8 человек 2.1...2.8. Кстати, данные некорректны- не может один чел подчиняться одновременно 2 начальникам. 641 одновременно подчиняется и СД и 610-у. Но это получилось из-за того, что я в данные добавил строку для тестирования не корректную, так что на правильных данных правильно отработает.
22 подчиняется 610-у (2.4), 13809 подчиняется 22-у (2.4.1), а 4 человека подчиняются 13809-у (2.4.1.1 ..... 2.4.1.4)
То есть иерархия выстроена.
Я не берусь преобразовывать ваш текстовый массив в эксел-таблицу (времени жалко), пришлёте ексел-таблицу с примером, буду смотреть. На портале есть раздел "мои файлы", туда можно её поместить и сослаться в вашем сообщении на мини-форуме вопроса.
Об авторе:
Понеже не словес красных бог слушает, но дел наших хощет
давно
Посетитель
400336
8
18.05.2016, 11:27
общий
Ну смотрите в чем там суть, они 610 и 641 не 1 и 2 а оба 2 - то есть вторя ступень иерархии
извиняюсь что недостаточно подрбоно объяснил

а на счет ттого что данные не корректны это не совсем так - это айди позиций - скажем так функциональное разделение
один чел может на 50 процентов функций относится к фронт офису и на 50 к бэк - это условно
и поэтому получается что одна позцияи имеет как бы двух начальникиов

На счет того что иехархия есть я согласен но она не совсем точно отображет рельное положение дел, поскольку добавляет лишние уровни, получается каждый начальник эт оновый уровень а на самом деле первые два эт оодин уровень следующие , допустим 28 это следующий уровень и так далее
давно
Модератор
137394
1850
18.05.2016, 15:53
общий
18.05.2016, 16:29
Адресаты:
приведите свой пример исходных данных, желательно более развитый чем в вопросе, и покажите, как он должен выглядеть после обработки.
По моему скромному мнению, если боссу СД подчиняются непосредственно 5 чел, то они на одном уровне иерархии, их условно можно пронумеровать
1
2
3
4
5
Здесь 1,2,3,4,5 не уровни иерархии, а номер по порядку в одном уровне иерархии- они все подчиняются непосредственно СД.
Если руководителям этого уровня иерархии кто-то подчиняется, это более низкий уровень иерархии, условно их можно пронумеровать
1.1
1.2
....
2.1
2.2
....
....
5.1
5.2
.....
Все эти люди находятся на одном уровне иерархии, они подчиняются человеку, который непосредственно подчиняется СД.

Если любому человеку из этого списка, например 2.4, еще кто-то подчиняется, то это еще более низкий уровень иерархии,и его пронумеруем
2.4.1
2.4.2
2.4.3
......
Или аналогично для людей, подчиняющихся руководителю 5.10
5.10.1
5.10.2
.....
Все эти люди на одном уровне иерархии, они подчиняются каждый своему руководителю, который подчиняется руководителю, который подчиняется непосредственно его светлости главному боссу.
И так далее если есть более глубокая подчинённость.
Именно этот алгоритм реализован. То есть, уровень иерархии тут наглядно виден по числу разделителей в номере, как это обычно делается в документах, что то типа том 5, глава 45, параграф 13: 5.45.13
Там две позции под СД - 00610 и 00641 - они обе на втором уровне иеррархии получаются
а у вас согласно коду выходит что один выше другого
А как бы вы хотели, в таблице из двух столбцов кто-то обязательно будет помянут раньше, хоть они и на одном уровне иерархии.
А Что хотите Вы?

Кстати, при чём тут нарушение конфиденциальности: два столбца в ексел- таблице с числами, ничего никому не говорящими, без фамилий, наименования отделов, не имеют ни для кого иного практического смысла, кроме как объект решения задачи.
Упакуйте раром, например, можно с паролем, пришлите мне ссылку в личную почту. Все дела ...
Об авторе:
Понеже не словес красных бог слушает, но дел наших хощет
давно
Посетитель
400336
8
18.05.2016, 17:09
общий
Я бы и рад прислать, и я с вами согласен что это просто цифры, и в отрыве от контекста они ничего не значат, но у нас фиксируются все выгрузки внешние и тщательно проверяются
Прибегут IT безопасники и им не объяснишь что это цифры которые никому не понятны, у них свои инструкции - они обязаны об утечке данных информировать головной офис в США.

Так что я могу только в сообщение вставить данные

И еще - у этой задачи есть скажем так шаблон по которому мы будем их презентовать
Цель - узнать сколько в компании уровней подчинения - если идти по вашей струкуте - она имеет логику несомненно, но тогда получится что 1,2,3.ит.д это уровни иерархии, а у нас их всего 8
и нам надо понять сколько подчиненных под каждым начальником и сколько начальников над подчиненным
то есть цифра 5 фактически значит что он на 5 уровне (это ближе к низу)
должно быыть условно так
1 CEO
2 Начальники управлений
3 Начальники отделов
и т.д.
а если 123456 - у нас там 560 менеджеров и каждый будет как новый уровень читаться
вот такая проблма
давно
Модератор
137394
1850
18.05.2016, 18:55
общий
18.05.2016, 19:10
Адресаты:
Вот слегка изменённая таблица. Данные придумал сам. Таблицу организовал с фильтром. Можете фильтровать как по уровню подчиненности, так и по любому боссу. Внизу автоматом подсчитывается кол-во человек, выбранных по фильтру. Можно указать фильтр, например: "Начинается с 2." и посчитать, сколько людей в подразделении 2. Можно выбрать фильтр, например, иерархия 4 уровня, получим число людей этого уровня иерархии. А если очень хочется, можно отсортировать таблицу по уровням иерархии. Можно средствами эксел, можно и макрос поменять.
Об авторе:
Понеже не словес красных бог слушает, но дел наших хощет
давно
Посетитель
400336
8
18.05.2016, 18:57
общий
На первый взгляд выглядит как будто все в порядке, но надо обкатать на реальных данных
давно
Модератор
137394
1850
18.05.2016, 19:36
общий
Адресаты:
Вот таблица с другой сортировкой
Об авторе:
Понеже не словес красных бог слушает, но дел наших хощет
давно
Посетитель
400336
8
20.05.2016, 11:04
общий
Извиняюсь за поздний ответ последние дни были очень загруженными, у меня просто параллельно несколько задач)
Я посмотрел ваш результат, и есть одна вещь которая меняя смущает
00641 - он тоже второй уровень а не третий
они оба подчиняются напрямую СД
по вашей классификации он на 3-м уровне вместе с еще несколькими позициями
это неправильно, и проблема в том что если на втором уровне я просто фильтрами в экселе могу отследить человека, то на 3-5 это будет уже невозможно отследить всех, а они похоже там все съезжают.
у нас 7-8 уровней примерно, а по такой логике получится очень много, и если второго я могу руками поменять потому как я его вижу то дальше я уже не смогу найти)
Прошу отнестись с пониманием к моим притязаниям)
Давайте я вам все 3700 отправлю в сообщении?
давно
Модератор
137394
1850
20.05.2016, 14:33
общий
20.05.2016, 15:10
00641 - он тоже второй уровень а не третий
они оба подчиняются напрямую СД

Во первых, давайте договоримся о терминологии. У меня те, кто подчиняется СД - первый уровень. Если надо отобразить по другому - не проблема прибавить единичку в значение уровеня иерархии.

Во вторых, где Вы видите в Вашей постановке, что 641 подчиняется СД?
А раз он не подчиняется СД, то он ниже в иерархии чем 610, как следует из Вашей постановки, 641 подчинён 610.

00610 СД
00641 00610

Начинаю подозревать, что вам нужно, чтобы все, у кого есть кто-то в подчинении - это один уровень иерархии, а все остальные - в другом. Иначе не берусь объяснить, почему 610 и 641 на одном уровне.

В третьих, если что-то отправите в сообщении, то мне не нужна абракадабра с непонятными данными как в предыдущем сообщении. Там айди с пробелами, имхо, чего не должно быть, как их потом в таблицу корректно без затрат времени переместить - не представляю. Работа с некорректными данными утомляет

Чтобы иметь минимум временнЫх затрат, я бы предложил Вам сохранить лист таблицы в csv-формате (Меню Файл-Сохранить как-тип файла выбрать csv.) Затем его можно как текст передать в сообщении.

Если Вы не против, я бы предыдущее сообщение вычистил от этих данных. Сейчас мне не хочется этого делать без вашего разрешения - вдруг кто-то на них польстится.
Об авторе:
Понеже не словес красных бог слушает, но дел наших хощет
Форма ответа