如何在Visio VBA中突出显示组中存在的形状

我要突出显示与特定组相对应的形状。以下代码仅突出显示与活动页面或母版分组在一起的形状,而不突出显示在活动页面中存在的形状。

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
lybgg121 回答:如何在Visio VBA中突出显示组中存在的形状

我认为您想以编程方式在组中选择子形状。在Visio中这样做并不明显,所以请允许我帮助。我将在my website上放置指向两篇文章的链接,并在帖子的末尾添加与Microsoft相关的一篇文章。这些将进一步详细讨论与选择相关的主题。

所以让我们解决您的问题...

设置

  1. 在Visio中打开空白图形
  2. 绘制两个矩形,然后将它们分组

您现在在此页面上具有三个形状。

  • Sheet。 1 是子形状
  • Sheet。 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

顺便说一句,上面的Sub比必须的要挑剔和长得多。但是,当您开始添加功能和行为时,使事情变得简单整洁将很有帮助。实际上,您可以像这样将整个过程放在一行中,甚至可以将其粘贴到“即时”窗口中:

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

现在子选择Sheet.1或Sheet.2。有人会认为我们可以简单地将shp对象更改为子形状之一ala:

'// 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

Voila!在活动窗口中选择了子形状!

如果要检测已经选择了哪些形状,则必须使用Selection对象的 IterationMode 属性。这非常令人困惑,而且我不认为您现在正在要求这样做。但是知道该术语将有助于您在将来需要时寻求帮助。

文章

Getting a Handle on Selecting and Subselecting Visio Shapes

Detect Sub-selected Shapes Programmatically

Selection.Select method (Visio)

本文链接:https://www.f2er.com/2613923.html

大家都在问