【问题标题】:Visio VBA Get Shape from SelectionVisio VBA 从选择中获取形状
【发布时间】:2019-02-02 02:59:14
【问题描述】:

我需要在 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

选择“顶级”组时,它可以工作。 当组内部的形状也是如此,它也是如此,它没有。 When a shape which is not in a group is selected, it works again.

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

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

编辑:进一步澄清:我的文档中的形状都有相应的数据库条目。我想(通过 XML)向上下文菜单添加一个自定义删除按钮(有效),这应该调用一个删除方法,该方法获取调用该方法的形状作为参数,以便它可以搜索相应的数据库条目并删除使用 shape.delete 删除形状(及其所有子形状)之前的那个(以及任何子形状的条目,如果所选形状是一个组)

【问题讨论】:

  • 我明白你的意思。换句话说,您想要“鼠标指针位置的形状” - 对吗?

标签: vba ms-office visio


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    我不知道 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
    

    【讨论】:

    • 感谢您的建议!同样的问题在这里适用,只有“顶级”对象被识别为选择。当我在组内选择一个形状时,选择保持为空。请参阅编辑以获取更多上下文
    • @ksbawpn 我明白你的意思。换句话说,您想要“鼠标指针位置的形状” - 对吗?
    • 不,我确实想要选择的形状。用户选择它后,他将在上下文菜单中选择一个自定义项,因此指针位置不再位于形状上(即使我认为使用指针位置作为参考也会容易出错,因为形状可能位于彼此顶部,例如组形状)感谢您的输入!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-02
    • 1970-01-01
    相关资源
    最近更新 更多