2014-05-08 4 views
0

Visio에서 VBA를 처음 사용하고 Document 개체 수준이 아닌 이벤트 처리를 "가져 오는 중"문제가 발생했습니다. 즉, 셰이프 데이터 값이 변경 될 때 트리거되는 이벤트를 캡처하려고합니다. 다운로드 한 Visio 2010 SDK가 있으며 관련 이벤트는 FormulaChanged 및 CellChanged입니다. 그러나, 나는이 사건들에 방아쇠를 당기는 방법을 모른다. WithEvents 및/또는 AddAdvise를 사용해야하는 인터넷에서 수집 한 내용이지만 일부 SDK 코드 예제를 사용해도 방법을 파악할 수 없습니다.Visio에서 FormulaChanged 이벤트 캡처

셰이프의 셰이프 데이터 값을 편집 할 때 트리거되는 FormulaChanged 및/또는 CellChanged 이벤트를 VBA에서 어떻게 캡처합니까?

답변

1

당신은 이미 실현하는 것 같이, 이러한 이벤트를 트리거에 대한 몇 가지 옵션이 다음의 Visio 응용 프로그램에에서 WithEvents 참조를 저장하는

  1. 사용의 ThisDocument을, 다음, 때 모든 CellChanged을 잡아 이벤트를 FormulaChanged하고, 실행중인 경우 코드가 관심있는 모양인지 결정합니다. 이는 2에 비해 성능에 부정적인 영향을 줄 수 있습니다.
  2. 단일 모양에 대한 참조를 연결하는 VBA 클래스를 설정할 수 있으며, 그 하나의 모양에 대한 셀 및 수식 변화 이벤트. 값을보고 싶은 각 도형의 객체를 인스턴스화합니다.
  3. ThisDocument 또는 모든 클래스 모듈을 사용할 수도 있지만 ThisDocument는 싱글 톤이므로 단일 인스턴스에서 모든 셀 및 수식 변경 이벤트를 볼 수 있습니다. 이 설정 아주 간단, 1-3

:

  • 는 AddAdvise 방법 (http://msdn.microsoft.com/en-us/library/office/ms367505(v=office.12).aspx 여기 샘플 코드)를 사용합니다. 나는 아직 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 
    

    나는 당신의 질문에 대한 대답이 확실하지 않다,하지만 어쩌면 그것은 시작입니다.

  • +0

    코드를 가져 와서 ThisDocument 개체에 넣었습니다. 나는 대화 상자를 얻을 수 있도록 각각에 MsgBox "Test"를 추가했습니다. 그런 다음 일부 모양 데이터를 편집하려고했습니다. FormulaChanged 및 CellChanged 이벤트를 볼 수 있지만 MsgBox 또는 디버그 메시지 영역을 통해 아무 일도 발생하지 않습니다. 그러나 셰이프를 움직이면 Visio가 느려지지만 이벤트 모니터 문제 일 수 있습니다. –

    +0

    셰이프를 움직이면 많은 수의 셀과 수식이 업데이트되고, 느려지는 것은 이벤트 모니터에서 확인됩니다. 그러나, 위의 코드는 절대로 나를 위해 트리거되지 않습니다 (적어도 디버그 창에 아무것도 나타나지 않습니다). –

    +0

    먼저 class_initialize 하위를 실행 했습니까? 이 이벤트를 설정하려면 실행해야합니다 .. –