为什么 Outlook VBA 运行 中的 "Quit" 事件没有通过 class 模块?

Why doesn't the "Quit" event in Outlook VBA run a passed class module?

我有一个宏,在关闭 Outlook 客户端时,私有变量被设置为 class 模块的一个实例。代码 运行 没问题,没有抛出任何错误。然而,传递的 class 模块(如果我使用了错误的术语,请纠正我)没有它的子程序 运行.

目标是在应用程序退出时创建并保存新的注释项。

来自“ThisOutlookSession”(Microsoft Outlook 对象):

Option Explicit

Private ShutdownTrigger As Class2

Private Sub Application_Quit()
      
    Set ShutdownTrigger = New Class2
    
End Sub

来自“Class2”(Class 模块):

Option Explicit

 Private Sub 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

目前没有创建新笔记。请注意,子例程“ExitApp”代码在放置在“ThisOutlookSession”对象中时有效。

此外,作为一个可能不相关的问题,我是否需要创建一个私有变量“Shutdown Trigger”,或者我是否可以像在大多数子例程中那样使用 Dim 语句?

感谢您的帮助!

首先,代码中不需要新建OutlookApplication实例来创建新的笔记项Outlook。相反,您可以在 ThisOutlookSession 模块中获取一个 Application 实例并将其传递给方法。

其次,您需要在创建的对象上调用 ExitApp 方法:

Option Explicit

Private ShutdownTrigger As Class2

Private Sub Application_Quit()
      
    Set ShutdownTrigger = New Class2
    ShutdownTrigger.ExitApp()
    
End Sub

三、方法可能如下:

Option Explicit

 Private Sub ExitApp(olApp As Outlook.Application)
    Dim olNS As Outlook.NameSpace
    Dim olNoteItm As Outlook.NoteItem

    Set olNS = olApp.GetNamespace("MAPI")
    
    Set olNoteItm = olApp.CreateItem(olNoteItem)
    
    With olNoteItm
    
    .Body = "murphy"
    
    End With
    
    olNoteItm.Save

 End Sub

VBA Class Modules – The Ultimate Guide 文章的 VBA 中阅读有关 class 模块的更多信息。