Как выделить фигуру, присутствующую в группе в Visio VBA - PullRequest
0 голосов
/ 20 марта 2020

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

Sub CA_Trace_Conflict1()
    PCC_CA = InputBox("Enter PCC Band")

    'SCC1_CA = InputBox("Enter SCC1 Band")
    Dim shp As Visio.Shape
    Dim subshp As Visio.Shape
    Dim connectorshape As Visio.Shape
    Dim BandLinewidth As String
    Dim lngShapeIDs() As Long
    Dim count As Integer
    Dim PCC_Flag As Integer
    Dim SCC1_Flag As Integer

    PCC_Flag = 0
    SCC1_Flag = 0

    Dim DiagramServices As Integer
    DiagramServices = ActiveDocument.DiagramServicesEnabled
    ActiveDocument.DiagramServicesEnabled = visServiceVersion140 + visServiceVersion150
    Dim UndoScopeID1 As Long

    PCC_CA_space = PCC_CA & " "
    For Each shp In Visio.ActivePage.shapes
        If shp.Type = 2 Then 'Check if shp is a group
         For Each subshp In shp.shapes
                If InStr(shp.Text, PCC_CA_space) > 0 Then
                'If PCC_CA Like shp.Text Then
                Set connectorshape = shp
                Debug.Print shp.Parent
          Application.ActiveWindow.Page.shapes.ItemFromID(shp.ID).CellsSRC(visSectionObject,visRowLine, visLineWeight).FormulaU = "5.5 pt"
               '   Debug.Print shp.ID
                End If
            Next
     End If
    Next

End Sub

1 Ответ

1 голос
/ 20 марта 2020

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

Итак, давайте рассмотрим вашу проблему ...

Настройка

  1. Открыть пустой чертеж в Visio
  2. Нарисуйте два прямоугольника, затем сгруппируйте их

Теперь у вас есть три фигур на этой странице.

  • Лист. 1 представляет собой подвид
  • Лист. 2 представляет собой подвид
  • Лист. 3 - это группа

Вы можете программно выбрать такую ​​группу, как вы обнаружили:

Public Sub SelectGroup()

  '// Get the active window:
  Dim win As Visio.Window
  Set win = Visio.ActiveWindow

  '// Deselect everything:
  Call win.DeselectAll

  '// Get a shape object:
  Dim shp As Visio.Shape
  Set shp = Visio.ActivePage.Shapes.ItemFromID(3) '<<----- Sheet.3 is the group!

  '// Cause that shape to be selected in the window:
  Call win.Select(shp, Visio.VisSelectArgs.visSelect)

  '// Cleanup:
  Set shp = Nothing
  Set win = Nothing

End Sub

Кстати, подпункт выше гораздо более придирчиво и длиннее, чем должно быть. Но это поможет сделать вещи простыми и понятными, когда вы начнете добавлять функции и поведение. На самом деле вы можете в одну строчку полностью выполнить всю процедуру, как эта, - вы даже можете вставить ее в окно «Немедленно»:

Call Visio.ActiveWindow.Select(Visio.ActivePage.Shapes.ItemFromID(3), Visio.VisSelectArgs.visDeselectAll + Visio.VisSelectArgs.visSelect)

Теперь, чтобы выбрать «Лист 1» или «Лист 2». Можно было бы подумать, что мы могли бы просто изменить объект shp на один из подвидов, ала:

'// Sheet.1 is a subshape, you'll get an error
Set shp = Visio.ActivePage.Shapes.ItemFromID(1)  '<<----- ID = 1

, но это не сработает. Фактически вы получите ошибку «Неправильный целевой объект для этого действия».

Чтобы исправить это, мы должны передать другой аргумент методу Select :

Public Sub SelectSubshape()

  '// We've drawn two rectangles on a blank page, then
  '// grouped them. Sheet.1 and Sheet.2 are subshapes,
  '// Sheet.3 is the group.

  '// Get the active window:
  Dim win As Visio.Window
  Set win = Visio.ActiveWindow

  '// Deselect everything:
  Call win.DeselectAll

  '// Get a subshape object:
  Dim shp As Visio.Shape
  Set shp = Visio.ActivePage.Shapes.ItemFromID(2)

  '// Cause that shape to be SUBSELECTED in the window.
  '// Note the different argument: visSubSelect
  Call win.Select(shp, Visio.VisSelectArgs.visSubSelect) ' <<------ visSubSelect!

  '// Cleanup:
  Set shp = Nothing
  Set win = Nothing

End Sub

Вуаля! Subshape выделен в активном окне!

Если вы хотите определить, какие фигуры уже выбраны, вам придется поиграться со свойством IterationMode объекта Selection. Это довольно странно, плюс я не думаю, что вы просите об этом прямо сейчас. Но знание этого термина поможет вам искать помощь в будущем, если она вам понадобится.

Статьи

Получение справки о выборе и выборе форм Visio

Программно определять выбранные фигуры

Выбор. Выбор метода (Visio)

...