在Visio中捕获FormulaChanged事件

问题描述 投票:0回答:1

我不熟悉在Visio中做VBA,而且我遇到了“获取”不在Document对象级别的事件处理的问题。也就是说,我正在尝试捕获Shape Data值更改时触发的事件。我下载了Visio 2010 SDK,相关事件是FormulaChanged和CellChanged。但是,我不知道如何触发这些事件。我从互联网上收集到我需要使用WithEvents和/或AddAdvise,但我似乎无法弄清楚如何,甚至已经通过一些SDK代码示例。

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

vba events event-handling shape visio
1个回答
1
投票

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

  1. 使用ThisDocument存储对Visio应用程序的WithEvents引用,然后捕获所有CellChanged和FormulaChanged事件,并在运行时让您的代码确定它是否处于您感兴趣的形状上。这可能会对性能产生负面影响。 2:
  2. 您可以设置一个VBA类,它只挂钩对单个形状的引用,并监视该一个形状上的Cell和Formula更改事件。您将为要监视其值的每个形状实例化一个对象。
  3. 您还可以使用ThisDocument(或任何类模块,但ThisDocument是单例,因此您不必自己实例化)来在单个页面上查看所有单元格和公式更改事件。
  4. 使用AddAdvise方法(此处的示例代码:http://msdn.microsoft.com/en-us/library/office/ms367505(v=office.12).aspx

对于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

我不确定能回答你的问题,但也许这是一个开始。

© www.soinside.com 2019 - 2024. All rights reserved.