Как найти все фигуры в чертеже Visio и добавить каждую фигуру в массив? - PullRequest
1 голос
/ 21 мая 2019

Я новичок в VBA, и это мое первое задание, включающее уже существующий чертеж Visio.

Чертеж Visio состоит из нескольких фигур, и я в конечном итоге хочу найти способ определить, какие фигуры являются кабелями (две фигуры "соединителя", которые присоединяются динамическим соединителем) с использованием кода vba. Сделать это, 1) Я хочу начать с хранения всех имен фигур в массиве. 2) Затем я хочу провести перекрестную проверку этого массива с известными именами форм соединителей и создать новый массив только этих форм соединителей. 3) Затем я проверил бы, к какой форме подключен каждый разъем, и это позволило бы мне определить, к какому типу кабеля это относится (эта часть кода завершена). 4) Наконец, я бы назначил # кабеля одной из форм разъема (я думаю, у меня есть рабочий код для этого тоже).

Я пытаюсь выяснить, как реализовать шаги 1 и 2 с моим существующим кодом.

В настоящее время я могу обнаруживать связанные фигуры только тогда, когда выбрана одна из этих фигур:

Public Sub ConnectedShapes()
' Get the shapes that are at the other end of
' incoming connections to a selected shape
    Dim vsoShape As Visio.Shape
    Dim allShapes As Visio.Shapes
    Dim lngShapeIDs() As Long
    Dim intCount As Integer

    If ActiveWindow.Selection.Count = 0 Then
        MsgBox ("Please select a shape that has connections.")
        Exit Sub
    Else
        Set vsoShape = ActiveWindow.Selection(1)
    End If

    Set allShapes = ActiveDocument.Pages.Item(1).Shapes
    lngShapeIDs = vsoShape.ConnectedShapes(visConnectedShapesAllNodes, "")

    Debug.Print "   Shape selected:     ";
    Debug.Print vsoShape

    Debug.Print "   Shape(s) connected: ";
    For intCount = 0 To UBound(lngShapeIDs)
        connectedItem = allShapes.ItemFromID(lngShapeIDs(intCount)).Name
        Debug.Print connectedItem
        If InStr(1, vsoShape, "USB A - top") = 1 Then
            If InStr(1, connectedItem, "USB A Female") = 1 Then
                '    write cable's number
            ElseIf InStr(1, connectedItem, "USB Mini B") = 1 Then
                '    write cable's number
            ElseIf InStr(1, connectedItem, "USB Micro B") = 1 Then
                '    write cable's number
            ElseIf InStr(1, connectedItem, "USB C Male") = 1 Then
                '    write cable's number
            End If
        End If
    Next
End Sub

Существует ли встроенная функция для Visio vba, которая поможет мне выполнить шаги 1 и 2? Какой самый простой способ найти все фигуры в документе и сохранить их в массиве?

1 Ответ

1 голос
/ 22 мая 2019

Понимание желаемой бизнес-логики - это первый шаг. Ваши шаги 1 и 2 могут быть одним шагом.

Понимание пространства ваших решений - это понимание диапазона инструментов, которые дает вам язык программирования. В этом случае речь идет о том, как эффективно зациклить (например, For Each) и информационные контейнеры (например, Collection).

Вот пример кода:

Option Explicit ' Always use this at the top of a module. Always.

Function ExampleFindShapes(chosenPage as Page) as Collection
Dim foundShapes as New Collection ' Note the new part, this initialised the Collection
Dim shapeLoopIterator as Shape
Dim arrayLoopIterator as Long
Dim validShapes as Variant

    validShapes = Array("Bob", "Harry", "George")
    For each shapeLoopIterator in chosenPage.Shapes ' One way to loop through an object collection
        For arrayLoopIterator = LBound(validShapes) to UBound(validShapes) ' One way to loop through an array
            If shapeLoopIterator.Name = validShapes(arrayLoopIterator) Then
                foundShapes.Add shapeLoopIterator ' store the found shape as a reference to the shape
                'Could put something in here to break out of the loop
            End If
        Next arrayLoopIterator
    Next shapeLoopIterator
    ExampleFindShapes = foundShapes
End Function

Кодирование из памяти, поскольку на этом компьютере не установлена ​​программа Visio, поэтому Page может быть чем-то другим.

Я сохранил ссылку на форму вместо просто имени, потому что набор найденных фигур будет проще использовать в ваших частях 3 и 4, вместо того, чтобы вам снова пришлось искать и ссылаться на фигуры.

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

...