Захват события FormulaChanged в Visio

Я новичок в использовании VBA в Visio, и у меня возникают проблемы с "получением" обработки событий, не относящихся к уровню объекта документа. А именно, я пытаюсь зафиксировать событие, которое запускается при изменении значения данных формы. У меня загружен пакет SDK для Visio 2010, и связанные с ним события - FormulaChanged и CellChanged. Однако я не знаю, как активировать эти события. Я почерпнул из Интернета, что мне нужно использовать WithEvents и / или AddAdvise, но я не могу понять, как это сделать, даже просмотрев некоторые примеры кода SDK.

Как записать в VBA события FormulaChanged и / или CellChanged, которые запускаются, когда я редактирую значение данных фигуры для фигуры?


person M J    schedule 08.05.2014    source источник


Ответы (1)


У вас есть несколько вариантов запуска этих событий, как вы, кажется, уже понимаете:

  1. используйте ThisDocument для хранения ссылки WithEvents на приложение Visio, затем перехватите все события CellChanged и FormulaChanged, и, когда это произойдет, ваш код определит, находится ли он в интересующей вас форме. Это может отрицательно сказаться на производительности по сравнению с 2:
  2. Вы можете настроить класс VBA, который просто перехватывает ссылку на одну фигуру и отслеживает события изменения ячейки и формулы для этой фигуры. Вы должны создать экземпляр объекта для каждой формы, значение которой вы хотите отслеживать.
  3. Вы также можете использовать ThisDocument (или любой модуль класса, но ThisDocument является одноэлементным, поэтому вам не нужно создавать его самостоятельно) для просмотра всех событий изменения ячеек и формул на одной странице.
  4. Используйте метод AddAdvise (пример кода здесь: http://msdn.microsoft.com/en-us/library/office/ms367505%28v=office.12%29.aspx)

Для 1-3 настроить довольно просто. 4 еще не пробовал.

В модуле class / 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

Я не уверен, что это ответ на ваш вопрос, но, может быть, это начало.

person Jon Fournier    schedule 09.05.2014
comment
Я взял ваш код и поместил его в объект ThisDocument. Я добавил MsgBox Test к каждому, чтобы получить диалоговое окно. Затем я попытался отредактировать некоторые данные формы. Я вижу события FormulaChanged и CellChanged, но ничего не происходит ни через MsgBox, ни через область отладочного сообщения. Однако, если я перемещаю фигуру, Visio замедляется, но, возможно, это проблема с монитором событий. - person M J; 09.05.2014
comment
Подтверждено, что при перемещении фигуры обновляется множество ячеек и формул, а мое замедление происходит из монитора событий. Однако приведенный выше код никогда не запускается для меня (по крайней мере, в окне отладки ничего не отображается). - person M J; 14.05.2014
comment
Вы сначала запустили подпрограмму class_initialize? Это необходимо для настройки событий .. - person Jon Fournier; 15.05.2014