Visio VBA пытается получить список контейнеров и форм элементов - PullRequest
0 голосов
/ 23 марта 2020

Справочная информация: У меня есть код, который проходит через страницу Visio и возвращает все фигуры. Многие из этих фигур находятся в контейнерах, поэтому я хотел бы знать, какому контейнеру принадлежит форма.

Оригинальный подход: Я надеялся получить «родительский» контейнер для каждой фигуры ( Мне нужен только один уровень контейнера, в контейнерах нет контейнеров) с использованием свойства Shape.ContainedShape, но он возвращал только 0 для каждой фигуры.

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

Текущий подход: Я смог получить список всех контейнеры на странице, и теперь я хотел бы получить формы элементов для каждого контейнера. Это не так чисто, но это позволило бы мне сделать перекрестные ссылки на фигуры и получить контейнеры, к которым они принадлежат.

Проблема: При попытке выполнить «Ошибка 13 несоответствие типов» создайте массив, в котором столбец 0 будет именем контейнера, а столбец 1 - формами элементов.

' Create array of containers and member shapes
Dim arr() As Long
Dim vsoMemberShape As Shape
Dim vsoContainerShape As Shape
Dim containerArr() As Long
Dim rows As Integer
Dim i As Integer

For Each ContainerID In vsoPage.GetContainers(visContainerIncludeNested)

    Set vsoContainerShape = vsoPage.Shapes.ItemFromID(ContainerID)
    arr = vsoContainerShape.ContainerProperties.GetMemberShapes(1)
    rows = UBound(arr)
    ReDim containerArr(0 To rows, 0 To 1)
    For i = 0 To UBound(arr)

        Set memberShape = vsoPage.Shapes.ItemFromID(arr(i))
        containerArr(i, 0) = vsoContainerShape.NameU
        containerArr(i, 1) = vsoMemberShape.NameU

    Next

Next

' The following code is in a For loop, not shown
' shapeToName is what I want to compare to the member shapes in the container 
' array defined above, and then retrieve the corresponding container
' This is where the error is popping up
shapeToName = CStr(vsoShapeTo.Name)

Dim x As Integer
x = Application.Match(shapeToName, Application.Index(containerArr, 0, 1), 0)
shapeContainer = containerArr(x, 1)

1 Ответ

0 голосов
/ 23 марта 2020

Я думаю, что вы ищете Shape.MemberOfContainers, который возвращает массив контейнеров, членом которых является форма.

Вы также можете посмотреть на это сообщение, которое охватывает ту же проблему:

Visio: Как получить фигуры, содержащиеся в одной фигуре?

Я также добавлю ссылку на сообщение Дэвид Паркер, который охватывает контейнеры в контексте кросс-функциональной блок-схемы, которая хорошо использует контейнеры и списки:

https://bvisual.net/2009/09/07/visio-2010-containment-and-cross-functional-flowcharts/

...