【问题标题】:Rerun Outlook VBA script 'Application_Startup' regularly定期重新运行 Outlook VBA 脚本“Application_Startup”
【发布时间】:2019-04-12 08:56:18
【问题描述】:

我已经(使用来自 SO 的信息)实现了一个 VBA 宏,该宏在从 Outlook 规则中删除“运行脚本”选项后运行以处理新电子邮件。我这样做如下:

Private WithEvents Items As Outlook.Items

Public Sub Application_Startup()
' Add an inbox event listener
  Dim olApp As Outlook.Application
  Dim objNS As Outlook.NameSpace
  Set olApp = Outlook.Application
  Set objNS = olApp.GetNamespace("MAPI")
  ' default local Inbox
  Set Items = objNS.GetDefaultFolder(olFolderInbox).Items
  MsgBox "Startup macro run"

End Sub

Private Sub Items_ItemAdd(ByVal item As Object)
  'Do something on new email arrival
.
.
.
End Sub

但是收件箱侦听器似乎经常停止工作,我要么必须重新启动 Outlook,要么手动重新运行“启动”宏以使其恢复正常 - 这似乎是一个没有解决方案的常见问题。

问题 - 我不是 VBA 专家,我想知道是否可以在 'Items_ItemAdd(ByVal item As Object)' 宏结束时简单地重新运行“Application_Startup”宏来重新启动侦听器?

【问题讨论】:

  • 这对你没有任何好处——你知道当 Items.ItemAdd 事件触发时事件监听器工作。如果没有,ItemAdd 也不会触发。
  • @DmitryStreblechenko 我不知道,因为我是 Outlook VBA 的新手????但我知道它停止工作,而且我知道重新启动 Outlook 似乎可以让它再次工作,所以我想知道当我的所有搜索都显示这是一个没有解决方案的已知问题时,如何让它继续工作。希望作为答案发布的解决方案可以解决问题。
  • 每半小时运行一次代码stackoverflow.com/questions/12257985/…

标签: vba outlook


【解决方案1】:

如果您需要重置ItemAdd 事件处理程序,我认为使用ItemAdd 这样做没有任何意义。

您可以使用计时器(在 VBA 中不存在),也可以使用其他一些或多或少触发的事件,例如 Explorer.SelectionChange 事件(Explorer 可以从 Application.ActiveExplorer 检索) .

【讨论】:

  • 我想“为什么 ItemAdd 事件处理程序停止工作”的基本问题仍未得到解答?我已经搜索但没有找到答案。只是建议,例如将所有变量设置为“无”和“添加一个空的Application_Quit()
  • 如果与服务器的连接丢失,它可以停止触发,但这仅适用于在线(而不是缓存)模式。
  • 感谢您的意见。我根据主题中的单词将类别设置为公共子类,因此如果它停止工作,我可以手动运行它并手动重新启动收件箱侦听器。
  • 我注意到 addItem 偶尔出现错误 - “13 - 类型不匹配”,因此我扩展了错误处理程序例程以打印主题。也许这个错误是 addItems 停止工作的原因,或者它可能是它被破坏的症状,
  • 你确实需要显示蒙古包代码的相关sn-ps。请记住,收件箱可以包含 MailItem 以外的项目,例如 MeetingItem、ReportItem 等。
【解决方案2】:

您可以添加一个新宏来执行最初存在于 Application_Startup 事件中的操作。然后您可以稍后在 Items_ItemAdd 宏的末尾引用该子代码。

Private WithEvents Items As Outlook.Items

Public Sub Application_Startup()
   Call startupevents
End Sub

Sub startupevents()

' Add an inbox event listener
  Dim olApp As Outlook.Application
  Dim objNS As Outlook.NameSpace
  Set olApp = Outlook.Application
  Set objNS = olApp.GetNamespace("MAPI")
  ' default local Inbox
  Set Items = objNS.GetDefaultFolder(olFolderInbox).Items
  MsgBox "Startup macro run"

End Sub

Private Sub Items_ItemAdd(ByVal item As Object)
  'Do something on new email arrival
'
'
'
Call startupevents
End Sub

【讨论】:

  • 我不明白这是如何工作的——如果 ItemAdd 事件触发,您就知道一切正常,无需重置事件处理程序。如果没有触发 ItemAdd 事件,那么重置事件处理程序的代码也不会运行。
  • @DmitryStreblechenko 这取决于事件处理程序停止的时间和原因。 ItemAdd 在停止工作之前似乎工作了一两次。如果它在启动后运行几次后被禁用,那么每次从 startupevents 重新初始化它应该可以让它继续工作。
  • @Tim - 刚刚确认这不起作用。我可以手动重新运行startupEvents,然后它会再次运行,因此收件箱侦听器在其他某个时间点失败,并且根本没有调用Items_ItemAdd
  • 感谢您的意见。我根据主题中的单词将类别设置为公共子类,因此如果它停止工作,我可以手动运行它并手动重新启动收件箱侦听器。
【解决方案3】:

更简单的代码可能会产生影响。

Private WithEvents Items As Outlook.Items

Public Sub Application_Startup()
    ' Add an inbox event listener
    Dim objNS As Outlook.NameSpace

    ' The code is in Outlook, not being called, for example, from Excel.
    Set objNS = Session.GetNamespace("MAPI")
    ' default local Inbox
    Set Items = objNS.GetDefaultFolder(olFolderInbox).Items
    MsgBox "Startup macro run"
End Sub

如果以上没有影响,那么这可能会足够频繁地重新运行 Application_Startup。

Private Sub Application_ItemSend(ByVal Item As Object, Cancel As Boolean)
    Application_Startup
End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-24
    • 2016-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多