Есть у шейпа такой метод - AutoConnect. С его помощью один шейп присоединяет к себе другой.
Метод принимает также параметр, с помощью которого можно задать направление размещения для присоединяемого шейпа. Раньше как-то не приходилось задумываться, насколько сильно влияние этого параметра на скорость работы. Но вот неожиданно такой случай подвернулся.
Была у меня программка, которая выводит в графическом виде структуру модулей проектов VBA (входимость и структуру вызовов). И вот, когда понадобилось проанализировать структуру довольно сложного проекта, был поражен ее медлительностью. Естественно, начал искать причину.
В результате обнаружилось, что наибольшее замедление дает вот этот оператор
Sh1.AutoConnect Sh2, visAutoConnectDirRight, mas
Когда-то я подумал, что схема должна располагаться слева направо, поэтому особо не задумываясь, выбрал параметр visAutoConnectDirRight. Причем размещение все равно получается не оптимальным, поэтому в конце оно еще раз приглаживается с помощью ActivePage.Layout.
В схеме чуть больше 280 процедур, даже и не скажешь, что это много. Но давайте сравним работу при двух значениях параметра.
280 раз выполняется вот такой цикл:
If (n1(i) <> n2(i)) And (n2(i) <> 0) Then
Set Sh1 = ActivePage.Shapes.ItemFromID(n2(i))
Set Sh2 = ActivePage.Shapes.ItemFromID(n1(i))
Sh1.AutoConnect Sh2, visAutoConnectDirRight, mas
'Sh1.AutoConnect Sh2, visAutoConnectDirNone, mas
End If
Сначала как было (используется visAutoConnectDirRight).
Потом как стало (используется visAutoConnectDirNone).
Сейчас-то, конечно, понятно, что при заданном направлении Visio приходится после каждого соединения перетаскивать шейп в нужное место. То есть размещение непрерывно рассчитывается, шейпы перемещаются. Во втором случае все соединяется по месту и только потом одним махом все пересчитывается.
В итоге схемы получаются одинаковыми, но скорость несравнима!
Вот такова цена одной строчки (или действия "не подумав").