Visio VBA从选择中获取形状

时间:2018-08-27 14:30:46

标签: vba ms-office visio

我需要引用Visio中选定的形状(通过单击鼠标,只需将其选中)。但是,形状可能会成组。 当我在一个组中选择一个形状时,似乎无法使它工作,shp对象保持为空。

Sub selectTest()
    Dim sel As Visio.Selection
    Set sel = ActiveWindow.Selection
    Dim shp As Visio.Shape
    Set shp = sel.PrimaryItem

    If Not shp Is Nothing Then
        MsgBox "It worked"
    Else
        MsgBox "No shape in sel"
    End If        
End Sub

选择“顶级”组时,它起作用。 当选择组内的形状(也可能是组本身)时,则不会。 选择不在组中的形状后,它将再次起作用。

上下文:我想从上下文菜单中触发自定义VBA代码。右键单击该形状,它将自动选择它。

当形状在一个组中时,如何获得对它的引用?

编辑:进一步说明:我的文档中的所有形状都有对应的数据库条目。我想(通过XML)在上下文菜单中添加一个自定义的Delete按钮(起作用),这应该调用deletemethod,该方法获取调用该方法的形状作为参数,以便它可以搜索相应的DB条目并删除在使用shape.delete

删除形状(及其所有子形状)之前(以及所选子形状为一组的任何子形状的条目)

2 个答案:

答案 0 :(得分:2)

使用Selection.IterationMode属性在选择中包括子选择的形状

Set sel = ActiveWindow.Selection
sel.IterationMode = 0
Set shp = sel.PrimaryItem

答案 1 :(得分:0)

我不了解Visio VBA,但请尝试一下:

更新

Sub selectTest()

    Dim x As Integer
    Dim sel As Visio.Selection
    Dim shp As Visio.Shape
    Dim inner_shape As Visio.Shape

    Set sel = ActiveWindow.Selection
    Set shp = sel.PrimaryItem

    For x = 1 To shp.Shapes.Count
        Set inner_shape = shp.Shapes(x)
        '// Do something with inner shape
    Next

End Sub