【问题标题】:ItemAdd runs a few times then stops working until I restart OutlookItemAdd 运行了几次然后停止工作,直到我重新启动 Outlook
【发布时间】:2020-09-16 23:49:24
【问题描述】:

我想在每次有新电子邮件到达收件箱时运行代码。

以下代码在“ThisOutlookSession”中

Public WithEvents oItems as Outlook.Items

Private Sub Application.Startup()
Set oItems = session.GetDefaultFolder(olFolderInbox).items
End sub

Private sub oItems_ItemAdd(ByVal item as object) 
Debug.print "New email detected" 
End sub

此代码针对 1 - 5 封新电子邮件运行。之后,除非我关闭 Outlook 并重新打开,否则它不会执行。

好像oItems 失去了与“会话”的连接。

【问题讨论】:

  • NewMailEx 事件对我来说是一个可靠的触发器,我用它来获取MailID 并使用带有GetItemFromID 的ID 来获取MailItem ... docs.microsoft.com/en-us/office/vba/api/…
  • @ProfoundlyOblivious 我在 Excel VBA 方面经验丰富,但对 Outlook vba 非常陌生。我究竟如何实现 NewMailEx?
  • @ProfoundlyOblivious 谢谢老兄/杜德特。这非常有效,并且在我完成的过去 50 封测试电子邮件中完美执行。

标签: vba events outlook


【解决方案1】:

您可以将其粘贴到ThisOutlookSession

Private Sub Application_NewMailEx(ByVal EntryIDCollection As String)

   Dim oNewMailItem As Outlook.MailItem
   Dim appNameSpace As Outlook.NameSpace
   
   Set appNameSpace = Application.Session
   
   Select Case appNameSpace.GetItemFromID(EntryIDCollection).Class
       Case Is = olMail
           Set oNewMailItem = appNameSpace.GetItemFromID(EntryIDCollection)
   End Select
   
End Sub

事件返回对象ID,对象ID用于获取对象。如果对象是电子邮件,则将其保存为局部变量。


或者,您可能不想“混淆”ThisOutlookSession,因此您可以使用自定义类并将邮件公开为公共属性。

ThisOutlookSession 中,您将拥有:

Public cNewMailEx As clsNewMailEx

Private Sub Application.Startup()
    Set cNewMailEx = New clsNewMailEx
End sub

在一个名为 clsNewMailEx 的类模块中,您将拥有:

Option Explicit

Private WithEvents olApp As Outlook.Application
Private pMailItem As Outlook.MailItem

Public Property Get NewMailItem() As Outlook.MailItem
    Set NewMailItem = pMailItem
End Property

Private Sub Class_Initialize()
   Set olApp = Outlook.Application
End Sub

Private Sub olApp_NewMailEx(ByVal EntryIDCollection As String)
   Dim appNameSpace As Outlook.NameSpace
   Set appNameSpace = Application.Session
   Select Case appNameSpace.GetItemFromID(EntryIDCollection).Class
       Case Is = olMail
           Set pMailItem = appNameSpace.GetItemFromID(EntryIDCollection)
   End Select
End Sub

现在,您可以在应用程序的任何位置使用cNewMailEx.NewMailItem检索新电子邮件

【讨论】:

  • 如果您只想做几件事,那么您的第一个答案非常好,但是感谢您提供的这个,它提供了更强大的结构,并为我提供了更多处理 vba 类的经验 - 我发现它们违反直觉且难以实施
【解决方案2】:

NewMailEx 是收件箱的首选替代方案。

对于其他文件夹,您可以在不关闭 Outlook 的情况下运行 Application_Startup

Private Sub Application_Startup() 中删除Private

1 - 您可以将Application_Startup 分配给一个按钮。

2 - 从您通常在白天运行的现有代码中减少手动调用 Application_Startup 的频率。

【讨论】:

    猜你喜欢
    • 2013-10-06
    • 1970-01-01
    • 2020-02-21
    • 2021-03-31
    • 2017-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多