【问题标题】:WithEvents object in Outlook VBA eventually fails to raise eventOutlook VBA 中的 WithEvents 对象最终无法引发事件
【发布时间】:2018-07-10 22:04:03
【问题描述】:

好的,好像有人以前遇到过这个问题,但我没有看到任何进一步的 cmets 或解决方案。请参阅this question 的已接受答案中的编辑。

我的情况是这样的。

我正在使用 Exchange 电子邮件帐户在 Win10 x64 下运行 Outlook 2013。我有时一次运行 Outlook 几天到一周或更长时间而没有关闭它。

我想在将新项目添加到“已发送邮件”文件夹时引发一个事件。这需要在 Application ItemSend 事件之后发生,因为假设我想在消息发送后删除消息,而您无法在 ItemSend 事件处理程序中执行此操作。

所以我有以下代码:

Public WithEvents goSent As Outlook.Items

Private Sub Application_Startup()

    'Establish the global object for the folder we want to monitor.

    Set goSent = Session.GetDefaultFolder(olFolderSentMail).Items

End Sub

Private Sub goSent_ItemAdd(ByVal Item As Object)

    'Do stuff here.

End Sub

在一天或更长时间内一切正常,但最终ItemAdd 事件处理程序停止触发。如果我进入 VBA 编辑器并手动运行Application_Startup,它就会重新开始工作。

[编辑:]另外一点信息:“内置”事件,如 Application ItemSend,无论 Outlook 运行了多长时间,似乎总是可靠地触发。

[编辑 2:] 这一次,我在事件停止触发后放了一天。我打开了 VBA 编辑器并在Application ItemSend 过程中放置​​了一个断点。当它停止时,我查询 goSent 对象并发现 (a) 它仍然存在(而不是 Nothing),但是 (b) 它只包含昨天存在的项目,大概当时从“已发送邮件”项目集合中“不受束缚”。当我在“立即”窗口中提交新的Set 语句时,它立即又开始工作了。

[编辑 3:] 我注意到 MSDN 文档说要将自定义对象的事件处理程序(例如我的 ItemAdd 事件)放入 类模块。我在 ThisOutlookSession 中有我的,但我的理解是 ThisOutlookSession 一个类模块。这有什么问题吗?

知道为什么会发生这种情况以及如何处理吗?我考虑为Application ItemSend 添加一个事件处理程序,并在每次触发时重新分配goSent 对象,但这并不能解决根本问题。

[编辑 4:] 一段时间以来,我在 Application ItemSend 处理程序中有一个 Set 语句,这似乎 大部分 处理了一些事情,即使它是一种解决方法,而不是真正的解决方案。当我长时间延迟已发送项目的交付时,它似乎失败了,同时我没有发送任何进一步的消息。然后goSent 对象与已发送邮件集合断开连接,并且在该点之后和Application ItemSend 再次触发之前,邮件实际上是从发件箱发送的。

谢谢!


[Edit 5:] 与原始问题无关:我发现我的宏无法使用处于 online 模式的 Exchange 服务器完成我想要的(即,未缓存模式)如果我的发件箱中有邮件延迟传递,并且在传递时间过去后 Outlook 已关闭。在联机模式下,Exchange 本身会发送这些邮件并将它们添加到服务器上的“已发送邮件”文件夹中,因此当 Outlook 重新打开时,这些邮件已经在“已发送邮件”集合中,并且不会触发任何事件。这是有道理的。见讨论here。看来我需要在我的 Application_Startup 宏中添加一些内容,以查找自 Outlook 上次关闭以来发送的邮件。

【问题讨论】:

  • 在一天或更长时间内一切正常 - 为什么?晚上离开时尝试关闭 Outlook,第二天早上来时打开它。
  • 实际上,我曾经有充分的理由让 Outlook 一直处于打开状态。让我们假装我仍然这样做。因此,关闭并重新打开 Outlook 可能会“解决”问题,就像在 ItemSend 事件处理程序中重新分配 goSent 对象可能会起作用一样。两者都没有真正解决根本问题。
  • 这可能与暂时失去与 Exchange Server 的连接有关吗?
  • 那是在线的还是缓存的 Exchange 配置文件?

标签: vba outlook


【解决方案1】:

我遇到了类似的问题,但从未找到合适的解决方案。我所做的是我编写了一个小批处理脚本来关闭和打开 Outlook 应用程序,然后我在任务计划程序中设置了一个任务,以便在工作时间之外每小时运行一次。您也可以在 vbs 中轻松完成。

【讨论】:

  • 听起来像是解决棘手问题的蛮力解决方案。有时,这就是你所能做的。
  • 我同意它并不完美,我对它不满意,但它确实能胜任。希望您能找到更好的解决方案!
猜你喜欢
  • 1970-01-01
  • 2017-11-17
  • 2011-08-30
  • 1970-01-01
  • 2021-08-25
  • 1970-01-01
  • 1970-01-01
  • 2021-06-25
  • 2016-10-12
相关资源
最近更新 更多