Обойдет все шейпы, но обойдет стороной все сгруппированные шейпы. Любая группа сама по себе является шейпом, поэтому ссылка на группу будет ActiveWindow.Page.shpGroup. А ссылка на элемент группы будет ActiveWindow.Page.shpGroup.shpElement
Перебирая коллекцию шейпов на странице, цикл не затронет шейпы из групп. Решение в организации вложенных циклов:
Код:
Private Sub test_1()
Dim vsoCurShp As Visio.Shape, vsoCurShp_1 As Visio.Shape, vsoCurShp_2 As Visio.Shape
Dim stNames$, stNameID As Variant, booErr As Boolean, stNames_1$
Set vsoShpSet = New Collection
For Each vsoCurShp In ActiveWindow.Page.Shapes
If vsoCurShp.Type = 2 Then
For Each vsoCurShp_1 In vsoCurShp.Shapes
If vsoCurShp_1.Type = 2 Then
For Each vsoCurShp_2 In vsoCurShp_1.Shapes
If vsoCurShp_2.Type = 2 Then booErr = True
vsoShpSet.Add vsoCurShp_2
Next
End If
vsoShpSet.Add vsoCurShp_1
Next
End If
vsoShpSet.Add vsoCurShp
Next
If booErr then MsgBox "Глубина вложенности более двух"
' Здесь код самих операций над шейпами
End sub
Здесь организовано два вложенных цикла. Если шейп на странице является группой, (Shape.Type=2) вложенный цикл перебирает элементы этой группы. Если какой-либо из элементов группы сам является группой, запускается еще один вложенный цикл. Если глубина вложенности более 2, то появится сообщение об этом. Перебранные элементы заносятся в коллекцию vsoShpSet, с которой в последующем и предполагается работать.