Outlook VBA中Application_Quit事件无法触发类模块子程序执行的问题咨询
解决Outlook关闭时类模块代码未执行的问题
为什么Class2里的ExitApp子程序没执行?
你现在的代码只是在Application_Quit事件里实例化了Class2,但从来没有主动调用ExitApp方法!类模块里的普通Sub不会自动运行,除非你显式触发它。这就是为什么直接把代码放到ThisOutlookSession里能正常工作——那时候代码是直接在退出事件里执行的,而类里的代码只是“躺”在那里没被调用到。
修正方案
有两种简单的方式可以解决这个问题:
方案1:实例化类后显式调用ExitApp
修改ThisOutlookSession里的代码,在创建类实例后直接调用ExitApp方法:
Option Explicit Private ShutdownTrigger As Class2 Private Sub Application_Quit() Set ShutdownTrigger = New Class2 ShutdownTrigger.ExitApp ' 主动触发类里的代码 End Sub
这样就能让类模块里的代码执行,创建并保存笔记项了。
方案2:改用类的Initialize内置事件
如果你希望类实例化时自动执行代码,可以把ExitApp改成类的Class_Initialize事件——这是VBA类模块的内置事件,当类被实例化时会自动触发:
修改Class2的代码:
Option Explicit Private Sub Class_Initialize() ' 替换原来的ExitApp子程序 Dim olApp As Outlook.Application Dim olNS As Outlook.NameSpace Dim olNoteItm As Outlook.NoteItem Set olApp = Outlook.Application Set olNS = olApp.GetNamespace("MAPI") Set olNoteItm = olApp.CreateItem(olNoteItem) With olNoteItm .Body = "murphy" End With olNoteItm.Save End Sub
这种情况下ThisOutlookSession里原来的代码不用改,只要实例化Class2,就会自动执行创建笔记的逻辑。
关于私有变量ShutdownTrigger的疑问
你问是否必须用模块级私有变量,还是可以用Dim声明局部变量?
在你的场景里,用局部变量Dim完全没问题,比如:
Private Sub Application_Quit() Dim tempTrigger As Class2 Set tempTrigger = New Class2 tempTrigger.ExitApp End Sub
模块级私有变量通常是在需要长期持有类实例(比如监听Outlook的邮件到达、文件夹变化等持续事件)时使用,避免实例被提前销毁。但你只是在退出时执行一次代码,用局部变量更简洁,完全能实现需求。
哪怕是用方案2(依赖Class_Initialize事件),局部变量实例化时也会触发事件,两种声明方式都能正常工作。
内容的提问来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

