Форум пользователей Visio
http://visio.getbb.ru/

Автоматическое создание сложной организационной диаграммы
http://visio.getbb.ru/viewtopic.php?f=29&t=1211
Страница 1 из 7

Автор:  man_2017 [ 02 окт 2017, 14:44 ]
Заголовок сообщения:  Автоматическое создание сложной организационной диаграммы

Добрый день, уважаемые форумчане!

Помогите пожалуйста в освоении Visio 2016. Я хочу создать орг. структуру компании на основе Excel файла (пример во вложении). Структура периодически меняется, поэтому хочу использовать Excel как исходник для последующего автоматического обновления.

Вопрос в следующем : Как сделать многоуровневую структуру к примеру из 4 - 6 отделов? Как к некоторым отделам добавить фотографию? Где почитать по "настройкам" , к примеру если я хочу что бы Visio нарисовал некоторые отделы в виде квадратов, а другие в виде круга?

p/s В интернете нашел инфу по мастеру создания диаграмм, но там описание на небольшом примере, не понимаю как его использовать по своей задачи.

Очень надеюсь на вашу помощь!

Дополнено позднее: 29.09.2021
ниже добавлена ссылка на обсуждение, начавшееся в 2010 году, где утверждается что проще сделать свое решение с нуля, чем пытаться скрестить его с существующим мастером построения орг-диаграмм.
nashwaan в ветке обсуждения Its time for Visio MVPs/Developers to help us *sorting* organization chart писал(а):
The problem: The order of subordinates is unpredictable/undefined when laying out organization chart by Visio. Everytime you import same source file, it is layed out differently which is really frustrating.


Вложения:
Комментарий к файлу: Пример
_пример Visio.xlsx [16.58 Кб]
Скачиваний: 422

Автор:  Tumanov [ 02 окт 2017, 17:40 ]
Заголовок сообщения:  Re: Автоматическое создание сложной организационной диаграммы

Основные приемы создания оргдиаграмм должны быть в Microsoft. Или в переводном виде вот здесь:
https://blogs.technet.microsoft.com/vis ... 7/08/3931/
https://blogs.technet.microsoft.com/vis ... 06/08/854/
https://blogs.technet.microsoft.com/vis ... 4/03/3693/
https://blogs.technet.microsoft.com/vis ... 10/03/726/
Возможно, все это Вы уже видели.
Для освоения автопостроения оргструктуры путем импорта данных я бы посоветовал начать с обратной операции. Сначала рисуете оргструктуру вручную, потом экспортируете ее в тот же Excel. Смотрите, что там получилось и оформляете свои данные таким же образом.
Ваши данные для импорта не подходят. В первую очередь потому, что в штатных средствах все связи основаны на отношении подчиненный - начальник. То есть связь описывается двумя колонками (а не более). Поэтому Вашу таблицу придется переформатировать.
Опять же штатными средствами связи трактуются как связи подчинения, а не входимости. Это значит не "отдел 1 и отдел 2 входят в отделение 5", а "начальник отдела 1 подчиняется начальнику отделения 5, начальник отдела 2 подчиняется начальнику отделения 5". Поэтому у них и фотографии возможны на любом уровне.
Теперь по вопросам:
1. Многоуровневая структура. Ну, это само получается. Просто цепочка подчиненности составится из нескольких строк.
2. К некоторым отделам добавить фотографии. В тех ссылках, которые я привел выше, это есть.
3. Некоторые отделы в виде квадратов, а другие в виде круга... А вот это штатными средствами седлать невозможно. Если уж меняется вид шейпов, то он меняется для всей диаграммы сразу. Причем диаграмма еще и полностью перерисовывается.
Но если возможностей штатных средств не хватает, то можно их уже самому усовершенствовать. Например так, как показано в этой статье
https://blog.bvisual.net/2012/05/08/cre ... roperties/
Или еще более радикально. Вплоть до создания своего приложения для импорта. Уж в своем приложении можно делать все, что угодно. (Кстати, для оргструктуры это должно быть не такой уж сложной задачей).

Автор:  Tumanov [ 02 окт 2017, 17:44 ]
Заголовок сообщения:  Re: Автоматическое создание сложной организационной диаграммы

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

Автор:  man_2017 [ 02 окт 2017, 21:27 ]
Заголовок сообщения:  Re: Автоматическое создание сложной организационной диаграммы

Спасибо большое за развернутый ответ, буду разбираться :)

Автор:  BPM [ 10 окт 2017, 10:15 ]
Заголовок сообщения:  Re: Автоматическое создание сложной организационной диаграммы

man_2017 писал(а):
буду разбираться


К сожалению, вынужден Вас огорчить.
Профессиональное использование Мастера орг-диаграмм от Microsoft нереально.
В нем нельзя задавать горизонтальное ранжирование подразделений.

Простая задача. Двухуровневая структура. Есть директор и три зама: первый, второй, третий. Мастер Microsoft всегда раскидывает их по разному, а нужно чтобы "слева - направо" шли: Первый зам, второй зам, третий зам. Если Вы принесете директору схему орг-структуры, где его первый зам - в самом правом углу (в заднице), то он и его первый зам расскажут Вам все о таком подходе.

Для ранжирования должно предусматриваться отдельное поле или браться строгая очередность из таблицы (при горизонтальном ранжировании подразделений, т.е. кто "левее"). В штатном мастере Microsoft - этого нет (во всяком случае в 2010).

Поэтому серьезно относиться к штатному Мастеру орг - диаграмм нельзя, - это игрушка.
Однако, существуют Мастера орг-диаграмм (Excel -> Visio) сторонних компаний.
Там вводится дополнительное поле "ранг", которое и позволяет задавать нужную горизонтальную иерархию.

Автор:  Tumanov [ 11 окт 2017, 10:14 ]
Заголовок сообщения:  Re: Автоматическое создание сложной организационной диаграммы

Цитата:
Поэтому серьезно относиться к штатному Мастеру орг - диаграмм нельзя, - это игрушка.

Ну, уж слишком категорично...
Есть и другие формулировки. Типа, "могут потребоваться некоторые ручные перемещения".
Но в целом - да. Замучаешься создать алгоритм, который подойдет всегда и всем и не потребует ручной доводки.
Частную задачу, когда не нужна универсальность, проще решить своим алгоритмом.

Автор:  Tumanov [ 11 окт 2017, 12:09 ]
Заголовок сообщения:  Re: Автоматическое создание сложной организационной диаграммы

Кстати...
Можно еще попробовать "доводку" штатного алгоритма своими средствами.
Например, есть предположение, что визард игнорирует очередность только в момент первоначального размещения шейпов. После этого при выполнении функции Re-Layout шейпы смещаются, выравниваются, но порядок следования сохраняется.
Отсюда идея. Если после автоматического построения диаграммы своим макросом переставить шейпы в нужном порядке и потом использовать функцию Re-Layout, то получим желаемую отсортированную картинку.
Как я понимаю, макрос всего-то должен в зависимости от какого-то параметра (тот же "ранг") выстроить значение User.DeltaX с автоувеличением. Причем даже не волнуют конкретные значения, нужно только, чтобы они нарастали. И в конце - Re-Layout.
Для конкретного случая можно даже делать разные сортировки. Например, у главного начальника выстраивать подчиненных по номеру (заместителя), а у начальников отделов - по алфавиту.
Надо бы как-нибудь попробовать... ;)
В простейшем случае можно такую операцию проводить узконаправлено. Например, только для зам'ов, а все остальные шейпы игнорировать.

Автор:  Tumanov [ 11 окт 2017, 13:18 ]
Заголовок сообщения:  Re: Автоматическое создание сложной организационной диаграммы

Попробовал.
Можно сказать, что, по крайней мере, в простейших случаях способ работает.

Вложения:
sort.gif
sort.gif [ 120.85 Кб | Просмотров: 4906 ]

Автор:  BPM [ 11 окт 2017, 19:45 ]
Заголовок сообщения:  Re: Автоматическое создание сложной организационной диаграммы

> Ну, уж слишком категорично...

Именно категорично. Свой Мастер MS распиарила, а работать с ним как проф-инструментом невозможно. Только поиграться.
"Доводить руками" - представьте, когда сложная иерархия и вся перемешена. Проще ее изначально руками нарисовать, чем переделать после мастера. Я говорю не о простых иерархиях, умещающихся на пол-страничке.

> Для конкретного случая можно даже делать разные сортировки. Например, у главного начальника выстраивать подчиненных по номеру (заместителя), а у начальников отделов - по алфавиту.

Подход должен быть один. Например, часто имеем НТЦ 1, НТЦ 2 и т.д.
В состав НТЦ входят управления, далее отделы.
Так пятый отдел из второго управления третьего НТЦ будет иметь номер "325". И все это должно соблюдаться на схеме. Это тривиально. Никаких "по алфавиту" ФИО начальников.

Подскажите, что нужно сделать ("доводку" штатного алгоритма своими средствами) чтобы получить то желаемое, о чем я сказал выше?
Просьба пошагово.

Вообще, применение Мастера орг-диаграмм применимо не только к орг-структуре., а к любой иерархической структуре.
Например, пытался его использовать для построения дерева бизнес-процессов (все процессы пронумерованы). Но из-за указанной проблемы Мастера - он неприменим НИГДЕ, т.к. работает непредсказуемо.
Хотя добавить поле "ранг" (или выстраивать лево-право на последовательности в таблице) - думаю совсем не великая проблема для MS.

Автор:  Tumanov [ 11 окт 2017, 23:45 ]
Заголовок сообщения:  Re: Автоматическое создание сложной организационной диаграммы

Я могу показать, как я изменяю сортировку в показанном выше примере.
Код:
Sub ttt()
    Dim Col As Collection
    Dim shp As Visio.Shape
    Set shp = ActivePage.Shapes("Executive")
    Set Col = New Collection
    Debug.Print shp.NameU
    ConnectedRecursive shp, Col
    Debug.Print Col.Count
    For i = 1 To Col.Count
        Debug.Print Col(i).Text
        Col(i).Cells("User.DeltaX") = i * 2
    Next
    ActiveWindow.DeselectAll
    ActiveWindow.Select Col(Col.Count), visSelect
    ActiveWindow.Selection.Move 0.2, 0
    ActiveWindow.DeselectAll
End Sub

Private Sub ConnectedRecursive(ByVal shp As Visio.Shape, Coll As Collection)
    For j = 1 To shp.FromConnects.Count
        If shp.FromConnects(j).FromSheet.Connects(2).ToSheet Is shp Then
            'Set shp1 = shp.FromConnects(j).FromSheet.Connects(1).ToSheet
        Else
            Set shp1 = shp.FromConnects(j).FromSheet.Connects(2).ToSheet
        End If
        '   Add unique
        Flag = True
        For i = 1 To Coll.Count   'Check
            If Coll(i) Is shp1 Then
                Flag = False
                Exit For
            End If
        Next
        AddSorted Coll, shp1
    Next
End Sub
Private Sub AddSorted(ByVal Coll As Collection, ByVal shp As Visio.Shape)
    shpText = shp.Text
    Flag = True
    For i = 1 To Coll.Count
        sText = Coll(i).Text
        If shpText < sText Then
            Coll.Add shp, , i
            Flag = False
            Exit For
        End If
    Next
    If Flag Then Coll.Add shp
End Sub

Автор:  Tumanov [ 11 окт 2017, 23:47 ]
Заголовок сообщения:  Re: Автоматическое создание сложной организационной диаграммы

Для сортировки я взял текст шейпа.
Объект сортировки - шейп Executive и его подчиненные.
Находится нужный шейп, его подчиненные выбираются функцией ConnectedRecursive в коллекцию. Коллекция сортированная.
Потом изменяем User.DeltaX в подчиненных шейпах.
-------
Если делать полную автоматику, то к этому макросу нужно бы добавить запуск штатного построителя (в начало) и вызов функции Re-Layout (в конец).
Вот по такому образцу и делать, но с Вашими полями.

Автор:  BPM [ 14 окт 2017, 22:38 ]
Заголовок сообщения:  Re: Автоматическое создание сложной организационной диаграммы

При использовании русского Excel, в макросе нужно заменить «Executive» на «Директор».
Попытался понять, как работают мастер и макрос. Картинка ниже.
Макрос «ttt» сортирует только второй уровень иерархии (подчинённых «Директора»). Третий ряд уже без сортировки. Что сделать, чтобы сортировка шла по всей иерархии?
Сортировка идет по алфавиту по имени шейпа. Имя шейпа берется на основе чего? Наклоном показал имена шейпов. Таблицу Excel строил штатным мастером, плюс добавил несколько строчек.

Спасибо за макрос и комментарий к нему.
Можете чуть подробнее прокомментировать код макроса? Может, недавно встречались подобные примеры на эту тему?
Появилась надежда, что действительно можно исправить кривую работу «Мастера орг - диаграмм».
Как вариант, под поле «ранг» использовать не отображаемое в шейпе поле.

И еще: на одной из машинок у меня стоят Excel 2010 + Visio 2003. Экспортировать мастером табличку Excel не вышло: Organization Chart Wizard Error: Unable to load Excel. Это нормально? Может где-то их (Excel & Visio) связать нужно?

Вложения:
primer_5a.gif
primer_5a.gif [ 68.74 Кб | Просмотров: 5320 ]

Автор:  Tumanov [ 14 окт 2017, 23:10 ]
Заголовок сообщения:  Re: Автоматическое создание сложной организационной диаграммы

Цитата:
на одной из машинок у меня стоят Excel 2010 + Visio 2003

Не обязательно брать данные непосредственно из Excel. Скорее всего можно сохранить их в CSV и брать в этом формате.
Цитата:
Макрос «ttt» сортирует только второй уровень

Да, макрос тестовый, поэтому сортирует даже не второй уровень, а только подчиненных «Executive». (Просто они действительно попадают на второй уровень).
Чтобы сортировать что-то еще, нужно отобрать нужные шейпы (например, по имени мастер-шейпа) и провести сортировку для каждого из них по-очереди.
Цитата:
Сортировка идет по алфавиту по имени шейпа

В макросе сортировка идет по тексту шейпа при заполнении коллекции.
Код:
    shpText = shp.Text
...
        sText = Coll(i).Text
        If shpText < sText Then
...
        End If
    Next

Очередной шейп вставляется в найденное место или в конец коллекции.
Если вместо shp.Text b Coll(i).Text брать другой атрибут, то будет сортироваться по нему.

Автор:  Tumanov [ 14 окт 2017, 23:18 ]
Заголовок сообщения:  Re: Автоматическое создание сложной организационной диаграммы

Я макрос особо не причесывал... Просто надрал куски из другой программы.
Если немного поподробнее, то
Код:
    Set shp = ActivePage.Shapes("Executive")

Здесь принимается единственный шейп, который обслуживается макросом. Вместо этого нужно будет собрать несколько. Например, в коллекцию.
Код:
    Set Col = New Collection
    ConnectedRecursive shp, Col
    Debug.Print Col.Count
    For i = 1 To Col.Count
        Col(i).Cells("User.DeltaX") = i * 2
    Next

Здесь собраются все подчиненные. Если выше будет набрано несколько шейпов, то этот участок нужно будет повторить несколько раз в цикле.
ConnectedRecursive собирает подчиненные шейпы. Она использует AddSorted, чтобы одновременно сортировать их при сборе.
А цикл, где Col(i).Cells("User.DeltaX") = i * 2 - это расстановка подчиненных шейпов в линейку со смещением по горизонтали на два дюйма. OrgChart использует такие шейпы, в которых смещение от родительского шейпа передается через ячейку User.DeltaX.

Автор:  BPM [ 16 окт 2017, 00:54 ]
Заголовок сообщения:  Re: Автоматическое создание сложной организационной диаграммы

Цитата:
Да, макрос тестовый, поэтому сортирует даже не второй уровень, а только подчиненных «Executive».

Видимо нужно сделать цикл, в котором перебрать все шейпы на странице типа «квадрат с двойной линией» (корневой шейп), т.е. те, которые имеют ветвление. Далее в цикле запустить макрос «ttt» (с параметром корневого шейпа, вместо const=«Executive») и таким образом отсортировать всех подчиненных всех корневых шейпов.

Вопрос аналогичный:
Как определить тип фигуры (шейпа)?
viewtopic.php?f=5&t=778

Как определить тип фигуры (шейпа) – применительно к нашему случаю: Rectangle c двойной линией (или как он правильно называется в ADDON OrgC11). А заодно - как определить Rectangle с одинарной линией.

Далее:
Dim shpAll As Visio.Shapes
Set shpAll = ActivePage.Shapes
For i = 1 To shpAll.Count
if sh.CellExists("Ellipse, Visio.VisExistsFlags.visExistsAnywhere) = -1 then ‘ только нужен не овал "Овал или круг", а прямоугольник с двойной линией
ttt shpAll(i).name
end if

Next

Автор:  Tumanov [ 16 окт 2017, 09:58 ]
Заголовок сообщения:  Re: Автоматическое создание сложной организационной диаграммы

Если вспомнить, что мы исправляем последствия работы оргвизарда, то можно действовать даже проще.
Он ведь использует только нужные шейпы. Значит для фильтрации достаточно перебрать все двумерные шейпы (не коннекторы).
Тогда головная процедура будет выглядеть вот так
Код:
Sub ReSort()
    Dim Col As Collection
    Dim shp As Visio.Shape
    For j = 1 To ActivePage.Shapes.Count
        Set shp = ActivePage.Shapes(j)
        If Not shp.OneD Then
            Set Col = New Collection
            ConnectedRecursive shp, Col
            For i = 1 To Col.Count
                Col(i).Cells("User.DeltaX") = i * 2
            Next
            If Col.Count > 0 Then
                ActiveWindow.DeselectAll
                ActiveWindow.Select Col(Col.Count), visSelect
                ActiveWindow.Selection.Move 0.2, 0
                ActiveWindow.DeselectAll
            End If
        End If
    Next
End Sub

(Это вместо ttt)

Автор:  Tumanov [ 16 окт 2017, 11:36 ]
Заголовок сообщения:  Re: Автоматическое создание сложной организационной диаграммы

Да, и в самом конце полезно прописать строчку
Application.Addons("OrgC11").Run ("/relayout")
Это чтобы вручную кнопку Re-Layout не нажимать.
Код:
    Next
    Application.Addons("OrgC11").Run ("/relayout")
End Sub

Скорректированная версия макроса на данный момент:
Код:
Sub ReSort()
    Dim Col As Collection
    Dim shp As Visio.Shape
    For j = 1 To ActivePage.Shapes.Count
        Set shp = ActivePage.Shapes(j)
        If Not shp.OneD Then
            Set Col = New Collection
            ConnectedRecursive shp, Col
            For i = 1 To Col.Count
                Col(i).Cells("User.DeltaX") = i * 2
            Next
            If Col.Count > 0 Then
                ActiveWindow.DeselectAll
                ActiveWindow.Select Col(Col.Count), visSelect
                ActiveWindow.Selection.Move 0.2, 0
                ActiveWindow.DeselectAll
            End If
        End If
    Next
    Application.Addons("OrgC11").Run ("/relayout")
End Sub

Private Sub ConnectedRecursive(ByVal shp As Visio.Shape, Coll As Collection)
    For j = 1 To shp.FromConnects.Count
        Set shp1 = Nothing
        If Not shp.FromConnects(j).FromSheet.Connects(2).ToSheet Is shp Then
            Set shp1 = shp.FromConnects(j).FromSheet.Connects(2).ToSheet
        End If
        '   Add unique
        Flag = True
        For i = 1 To Coll.Count   'Check
            If Coll(i) Is shp1 Then
                Flag = False
                Exit For
            End If
        Next
        If Not shp1 Is Nothing Then AddSorted Coll, shp1
    Next
End Sub
Private Sub AddSorted(ByVal Coll As Collection, ByVal shp As Visio.Shape)
    shpText = shp.Text
    Flag = True
    For i = 1 To Coll.Count
        sText = Coll(i).Text
        If shpText < sText Then
            Coll.Add shp, , i
            Flag = False
            Exit For
        End If
    Next
    If Flag Then Coll.Add shp
End Sub

Автор:  BPM [ 16 окт 2017, 12:16 ]
Заголовок сообщения:  Re: Автоматическое создание сложной организационной диаграммы

Ну вот, и почти готово. Может быть, соберете красиво? И громко заявим, что проблема, с которой бьются на просторах VBA Visio не годами, а десятилетиями решена товарищем Tumanov.

И это решение торжественно объявим на других многочисленных ресурсах, где много печали по поводу кривой работы Мастера орг-диаграмм, например,
http://www.visguy.com/vgforum/index.php?topic=2055.0
"Я думаю, что это одна из наиболее востребованных функций в организационной структуре Visio.
Проблема: порядок подчиненных непредсказуем / неопределенен при составлении организационной диаграммы Visio. Каждый раз, когда вы импортируете один и тот же исходный файл, он выкладывается по-разному, что действительно расстраивает…. "


Странно, все это как-то: оказалось решение и не очень сложным …
Кстати, хорошо бы в макросе сразу учесть поле ранг, ну хотя бы по номеру телефона (вместо).

Автор:  Tumanov [ 16 окт 2017, 12:59 ]
Заголовок сообщения:  Re: Автоматическое создание сложной организационной диаграммы

Надо подумать, как "собрать красиво".

Автор:  BPM [ 16 окт 2017, 15:24 ]
Заголовок сообщения:  Re: Автоматическое создание сложной организационной диаграммы

Tumanov писал(а):
Надо подумать, как "собрать красиво".

просьба при этом учесть:
а) реальные схемы орг-структуры содержат более одного листа (нужно "пробежаться" по всем листам);
б) для комментариев (в коде макроса) не нужно жалеть букв ("кашу маслом не испортить").

Страница 1 из 7 Часовой пояс: UTC + 3 часа [ Летнее время ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/