Eine rekursive Funktion zu schreiben, die alle Shapes (auch die Shapes in Gruppen) auflistet, ist nicht sehr schwierig:
Private Sub BistDuGruppe(vsshape As Visio.Shape)
Dim i As Long
ReDim Preserve lngShapeID(UBound(lngShapeID) + 1) ‚ — vergrößere die Dimension
lngShapeID(UBound(lngShapeID)) = vsshape.ID
If LiegstDuAufRichtigemLayer(vsshape) = False Then
For i = 1 To vsshape.Shapes.Count
Call BistDuGruppe(vsshape.Shapes(i))
Next i
End If
End Sub
Sie wird von außen aufgerufen:
For i = 1 To vsBlatt.Shapes.Count
Call BistDuGruppe(vsBlatt.Shapes(i))
Next i
Allerdings benötige ich die X- und die Y-Position der Shapes. Dabei fällt auf, dass der Wert des Result der Zelle PosX und PosY in Relation zum übergeordneten Shape berechnet wird und nicht die Absolut-Koordinten des Zeichenblattes widergibt. Also muss man auf das „Chef“-Shape zugreifen:
Private Function WerIstBossVonGruppe(vsshape As Visio.Shape) As String
Dim vsShapeTemp As Visio.Shape
Set vsShapeTemp = vsshape
If TypeName(vsshape.Parent) = „Shape“ Then
Set vsShapeTemp = vsBlatt.Shapes(WerIstBossVonGruppe(vsShapeTemp.Parent))
End If
WerIstBossVonGruppe = vsShapeTemp.Name
End Function
Wenn ein Shape Teil einer Gruppe ist, dann liefert TypeName(vsshape.Parent) die Info „Page“.