定期重新运行Outlook VBA脚本“ Application_Startup”

时间:2019-04-10 10:42:49

标签: vba outlook

我已经(使用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专家,我想知道是否可以简单地重新运行'Application_Startup'宏以在'Items_ItemAdd(ByVal item As Object)'末尾重新启动侦听器宏?

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

您可以添加一个新的宏,该宏执行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

答案 2 :(得分:0)

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

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