Vba 针对Microsoft Visio 2013/16自动检测形状类型的连接邻居

Vba 针对Microsoft Visio 2013/16自动检测形状类型的连接邻居,vba,shapes,visio,Vba,Shapes,Visio,我已经创建了自己的主控形状列表,并将其放在VSS文件中。 有一个形状连接器连接其余的。 此连接器在操作部分有一些线路 我浏览了很多网站,但没有发现任何关于检测连接事件并根据连接形状类型从操作部分调用所需线路的可能性 我还没有找到任何可以描述邻居或现有连接的节或VBA函数 其想法是更改连接器参数以显示正确的连接类型 我已经创建了自己的主控形状列表,并将其放在VSS文件中 你现在真的应该使用.vssx了 我浏览了很多网站,但没有发现任何关于检测连接事件的可能性 此文档级别上没有添加连接的事件,但应用

我已经创建了自己的主控形状列表,并将其放在VSS文件中。 有一个形状连接器连接其余的。 此连接器在操作部分有一些线路

我浏览了很多网站,但没有发现任何关于检测连接事件并根据连接形状类型从操作部分调用所需线路的可能性

我还没有找到任何可以描述邻居或现有连接的节或VBA函数

其想法是更改连接器参数以显示正确的连接类型

我已经创建了自己的主控形状列表,并将其放在VSS文件中

你现在真的应该使用.vssx了

我浏览了很多网站,但没有发现任何关于检测连接事件的可能性

此文档级别上没有添加连接的事件,但应用程序级别上有一个事件。 因此,您可以将应用程序对象添加到ThisDocument并侦听它的事件。 这可能会导致不可预见的内存泄漏,因为它引用了其父级! 其他人可能会对此有所了解

在ThisDocument代码隐藏中:

Option Explicit

Private WithEvents vsApp As Visio.Application


Private Sub Document_DocumentOpened(ByVal doc As IVDocument)
    OnStart
End Sub

Private Sub Document_BeforeDocumentClose(ByVal doc As IVDocument)
    OnStop
End Sub

Public Function Kickstart()
    'Call this function to restart in case the program stops
    OnStart
End Function

Private Sub OnStart()
    Set vsApp = Me.Application
End Sub

Private Sub OnStop()
    Set vsApp = Nothing
End Sub


Private Sub vsApp_ConnectionsAdded(ByVal Connects As IVConnects)
   If Not Connects.Document Is Me.DocumentSheet Then Exit Sub 'make sure only to listen to events happening in this document
    Dim connect As connect
    For Each connect In Connects
        Debug.Print "Added Connection: ", connect.FromSheet & " To " & connect.ToSheet
    Next connect
End Sub
Private Sub vsApp_ConnectionsDeleted(ByVal Connects As IVConnects)
   If Not Connects.Document Is Me.DocumentSheet Then Exit Sub 'make sure only to listen to events happening in this document
    Dim connect As connect
    For Each connect In Connects
        Debug.Print "Deleted Connection: ", connect.FromSheet & " To " & connect.ToSheet
    Next connect
End Sub
…并根据连接形状的类型从操作部分调用所需的行

要找到类型连接/形状,有很多可能性。 我的方法是在我的形状中使用用户定义的单元格来识别它们/检查它们是否应该引发动作。从那时起,您可以使用选择案例块

我还没有找到任何可以描述邻居或现有连接的节或VBA函数


最后两个特别相互关联,因为您可以对它们应用过滤器。

您可能无法避免在VBA中进行一些编码,我获得了自由并更新了标记以获得更多的可见性。另外,请用您已经尝试过的内容和您已经拥有的代码/操作更新问题。感谢提供详细的示例。如果我理解正确,我必须将该代码添加到每个新的文档Visio文件中,在其中我将使用我的形状集。或者我可以将上面示例中的VBA代码添加到VSSX文件中?理论上,您可以将Private WithEvents vsApp作为Visio.Application添加到任何模块中,这包括模具中的代码。要在模具中存储代码,必须将其另存为.vssm文档!请记住,只有在加载模具后,代码才会运行。我刚刚测试了代码,即使它存储在模具的ThisDocument中,它似乎也可以正常运行。您必须删除/更改If Not Connects.Document Is Me.DocumentSheet,然后退出子行,因为事件将从Visio文档而不是Visio模具引发。这只是一种保护措施,防止有人在同一个应用程序中打开了两个文档……实现这一点的正确方法可能是使用一个单独的类来侦听应用程序的事件,并可以保存对它应该监视的文档的引用。。。。