我有一個啓用了宏的模板,其中包含偵聽內容控制出口事件的事件偵聽器。這個想法是,當編輯文檔的標題頁上的「標題」或「日期」內容控件時,我們會自動更新標題中的「標題」和「日期」內容控件,以便作者不必輸入相同的內容兩次。Word VBA事件僅針對基於模板的文檔觸發一次
我的問題是,當我根據我的模板打開一個新文檔(右鍵單擊template => new,或者只是雙擊它)時,這些事件僅針對正在退出的內容控件的第一個實例觸發。我點擊CC內部,點擊CC外部,獲取MsgBox指示我的事件已經開始。然後我再試一次:點擊裏面的CC,點擊外面的CC,然後不是得到一個MsgBox。從我的事件處理程序類
代碼:
Public WithEvents doc As Word.Document
Private Sub doc_ContentControlOnExit(ByVal ContentControl As ContentControl, Cancel As Boolean)
MsgBox ContentControl.Range.Text
End Sub
我檢查了,發現我的NewMacros我的事件處理程序對象仍然定義(不是「無」),它只是它沒有得到ContentControlOnExit
事件,或者是無視它們。
如果我改變上面的代碼,以至於我沒有在事件主體內部進行實際的內容控制,問題就解決了 - 我的理論是在ContentControlOnExit
事件內觸發任何類型的內容控件時觸發遞歸ContentControlOnExit
事件並以某種方式導致問題。很顯然,如果我不允許在內容控件中進行任何操作,那麼這個事件就毫無用處。
即接收ContentControlOnExit
事件,如果我我的代碼更改爲不「破」未來ContentControlOnExit
事件:
Public WithEvents doc As Word.Document
Private Sub doc_ContentControlOnExit(ByVal ContentControl As ContentControl, Cancel As Boolean)
MsgBox "Content Control exit event"
End Sub
我使用eventsEnabled
布爾,試圖對doc_ContentControlOnExit
後衛試圖進行遞歸調用中這種情況是這個問題,但它沒有幫助。我使用的代碼是這樣的:
Sub Class_Initialize()
pEventsEnabled = True
End Sub
...
' in the doc_ContentControlOnExit sub:
If pEventsEnabled Then
' obvious race condition...
pEventsEnabled = False
' Fiddle around with some content controls
pEventsEnabled = True
End If
Excel有一個Application.EnableEvents
屬性,但是這似乎並沒有出現在Word中。
有趣的是,這一切工作正常時編輯模板本身,只是不適用於基於該模板的文檔。編輯模板時,每次退出內容控件時都會收到一個ContentControlOnExit
事件,並且我的所有代碼都正常工作。
如果有幫助,我在Windows 7 Professional 64位上使用Word 2010(Office Professional Plus)。我還證實,Word 2007中下發生
編輯同樣的問題:
我只是想設置事件處理程序對象調用「ReincarnateEventHandler」在NewMacros,進而設置的原始事件處理程序對象爲Nothing,然後實例化一個新的事件處理程序。這導致無限循環的事件處理程序處理第一個事件,然後設置一個新的事件處理程序,然後處理相同的(原始)事件。使用Application.OnTime延遲1秒的輪迴修復了無限循環,但沒有修復原始問題—即,放棄我的第一個事件處理程序,然後實例化新的事件處理程序不讓我在第一個事件之後捕獲後續事件。
是否可以將您的模板的非保密版本發佈到Dropbox或某處?我想看看它是如何構建的 - 我可能會以更多的方式提供幫助。 –
@Otaku:我在http://db.tt/B68pwtD上用Dropbox分享了一個「匿名」文檔版本 - 我是Dropbox的新手,所以讓我知道如果這個鏈接不起作用。我辦公室的其他人可以打開它,所以我認爲它很好。如果將文檔作爲模板打開,則每次進入和退出內容控件都應該顯示一個消息框,如果您將該文檔作爲新文檔打開,則做同樣的事情只會顯示一個消息框。 – George
明白了,請參閱下面的答案。 –