Vba 在Visio中捕获FormulaChanged事件

Vba 在Visio中捕获FormulaChanged事件,vba,events,event-handling,shape,visio,Vba,Events,Event Handling,Shape,Visio,我是Visio中VBA的新手,在“获取”不在文档对象级别的事件处理时遇到问题。也就是说,我试图捕获当形状数据值更改时触发的事件。我已下载Visio 2010 SDK,相关事件已更改为FormulaChanged和CellChanged。然而,我不知道如何触发这些事件。我从互联网上收集了需要与Events和/或AddAdvise一起使用的信息,但我似乎不知道该如何使用,甚至已经阅读了一些SDK代码示例 如何在VBA中捕获编辑形状数据值时触发的FormulaChanged和/或CellChanged

我是Visio中VBA的新手,在“获取”不在文档对象级别的事件处理时遇到问题。也就是说,我试图捕获当形状数据值更改时触发的事件。我已下载Visio 2010 SDK,相关事件已更改为FormulaChanged和CellChanged。然而,我不知道如何触发这些事件。我从互联网上收集了需要与Events和/或AddAdvise一起使用的信息,但我似乎不知道该如何使用,甚至已经阅读了一些SDK代码示例


如何在VBA中捕获编辑形状数据值时触发的FormulaChanged和/或CellChanged事件?

您似乎已经意识到,您有一些触发这些事件的选项:

  • 使用此文档存储对Visio应用程序的WithEvents引用,然后捕获所有CellChanged和FormulaChanged事件,运行时,让您的代码确定它是否位于您感兴趣的形状上。这可能会对性能产生负面影响,而不是2:
  • 您可以设置一个VBA类,该类仅将引用挂接到单个形状,并监视该形状上的单元格和公式更改事件。您将为每个要查看其值的形状实例化一个对象
  • 您还可以使用ThisDocument(或任何类模块,但ThisDocument是一个单例,因此您不必自己实例化)在单个页面上查看所有单元格和公式更改事件
  • 使用AddAdvise方法(此处的示例代码:)
  • 对于1-3,设置起来非常简单。我还没试过4

    在类/ThisDocument模块中:

    Public WithEvents app As Visio.Application
    Public WithEvents Pg As Visio.Page
    Public WithEvents Shp As Visio.Shape
    
    Private Sub app_CellChanged(ByVal Cell As IVCell)
        PrintCell Cell
    End Sub
    
    Private Sub app_FormulaChanged(ByVal Cell As IVCell)
        PrintCell Cell
    End Sub
    
    Private Sub Class_Initialize()
        Set app = Application
        Set Pg = ActivePage
        Set Shp = ActiveWindow.Selection(1)
    End Sub
    
    Private Sub Pg_CellChanged(ByVal Cell As IVCell)
        PrintCell Cell
    End Sub
    
    Private Sub Pg_FormulaChanged(ByVal Cell As IVCell)
        PrintCell Cell
    End Sub
    
    Private Sub Shp_CellChanged(ByVal Cell As IVCell)
        PrintCell Cell
    End Sub
    
    Private Sub Shp_FormulaChanged(ByVal Cell As IVCell)
        PrintCell Cell
    End Sub
    
    Private Sub PrintCell(Cell As Visio.Cell)
        Debug.Print Cell.Shape.ContainingPage.Name & "!" & Cell.Shape.Name
    End Sub
    

    我不确定这是否回答了您的问题,但也许这只是一个开始。

    我将您的代码放在ThisDocument对象中。我将MsgBox“Test”添加到每个对话框中,这样我就可以得到一个对话框。然后我尝试编辑一些形状数据。我可以看到FormulaChanged和CellChanged事件,但无论是通过MsgBox还是调试消息区域,都不会发生任何事情。但是,如果我移动形状,Visio会减慢速度,但这可能是事件监视程序的问题。已确认移动形状会更新一组单元格和公式,我的减慢速度来自事件监视程序。但是,上面的代码从未为我触发(至少,调试窗口中没有显示任何内容)。您是否先运行了类_initialize子?这需要运行以设置事件。。