Word 2003 VBA疑问:DocumentBeforePrint事件为何重复执行?
这是Word 2003 VBA的Bug吗?DocumentBeforePrint事件会多次执行?
这确实不是Word 2003的Bug,而是你重复注册事件处理程序导致的问题。
问题根源
每次打开或新建基于test.dot的文档时,都会触发Document_Open或Document_New事件,进而调用Register_Event_Handler。你当前的代码每次调用这个过程时,都会创建一个新的EventClassModule实例X,并将其appWord属性绑定到Word.Application对象。
这就意味着:每打开一个文档,就会多一个监听DocumentBeforePrint事件的实例。当你执行打印操作时,所有注册过该事件的实例都会触发对应的处理逻辑,所以打开2个文档会触发2次,3个文档触发3次。
解决方案:确保事件只注册一次
我们需要添加一个全局标记变量,用来跟踪事件是否已经完成注册,避免重复绑定。同时要把事件类的实例变量提升为全局变量,防止被重复创建。
修改后的代码如下:
1. 模板模块(ThisDocument)代码
' 全局变量:标记事件是否已注册 Dim IsEventRegistered As Boolean ' 全局事件类实例,避免每次被重新创建 Dim X As New EventClassModule Sub Register_Event_Handler() ' 只有未注册时才执行绑定操作 If Not IsEventRegistered Then Set X.appWord = Word.Application IsEventRegistered = True End If End Sub Private Sub Document_New() Call Register_Event_Handler End Sub Private Sub Document_Open() Call Register_Event_Handler End Sub
2. 事件类模块(EventClassModule)代码
Public WithEvents appWord As Word.Application Private Sub appWord_DocumentBeforePrint _ (ByVal Doc As Document, _ Cancel As Boolean) MsgBox "WORKING!" End Sub
关键修改说明
- 新增
IsEventRegistered全局布尔变量:用来记录事件是否已经完成注册,确保Register_Event_Handler只会执行一次绑定操作。 - 将
X变量改为全局:避免每次调用注册过程时创建新的事件类实例,保证只有一个实例在监听DocumentBeforePrint事件。
修改完成后,保存模板并重新打开,新建多个文档后执行打印操作,你会发现DocumentBeforePrint事件只会触发一次了。
内容的提问来源于stack exchange,提问作者Eigen
相关产品推荐
相关产品推荐

