如何从VBA代码调用Outlook的桌面警报

时间:2015-05-15 11:36:01

标签: vba outlook outlook-vba

我在Win XP上运行Outlook 2003。我的桌面提醒已开启并且运行顺畅。

但是最近我创建了一个VBA宏,它将传入的电子邮件分类到几个不同的文件夹中(通过ThisOutlookSession中的item_add事件)。这以某种方式阻止桌面警报显示。

有没有办法手动从VBA代码调用桌面警报?也许是某种功能。

P.S:我无法通过规则对电子邮件进行排序,这不是一个选项

基本上我正在使用RegEx查找电子邮件中的6位数代码

我的代码(对不起,这是我在互联网上找到的其他代码片段的拼凑而已

Option Explicit

Private WithEvents olInboxItems As Items

Private Sub Application_Startup()
Dim objNS As NameSpace
Set objNS = Application.Session
Set olInboxItems = objNS.GetDefaultFolder(olFolderInbox).Items
Set objNS = Nothing
End Sub

Private Sub olInboxItems_ItemAdd(ByVal Item As Object)
On Error Resume Next

Dim targetFolder As Outlook.MAPIFolder
Dim myName As String

Dim Reg1 As RegExp
Dim M1 As MatchCollection
Dim M As Match

Set Reg1 = New RegExp
myName = "[MyName]"

' \s* = invisible spaces
' \d* = match digits
' \w* = match alphanumeric

With Reg1
    .Pattern = "\d{6}"
    .Global = True
End With

If (InStr(Item.To, myName) Or InStr(Item.CC, myName)) Then    ' if mail is sent or cced to me
    If Reg1.test(Item.Subject) Then
        Set M1 = Reg1.Execute(Item.Subject)
        For Each M In M1
            ' M.SubMatches(1) is the (\w*) in the pattern
            ' use M.SubMatches(2) for the second one if you have two (\w*)
            Set targetFolder = GetFolder([folderPath])  ' function that returns targetFolder
            Exit For
        Next
    End If
    If Not targetFolder Is Nothing Then
        Item.Save
        Item.Move targetFolder
    End If
End If   
End Sub

非常感谢

2 个答案:

答案 0 :(得分:1)

Outlook对象模型不提供任何用于管理通知的内容。相反,您可以考虑开发一个加载项,而不是在哪里可以使用允许模仿buit-in行为的第三方组件。例如,查看RadDesktopAlert组件。

有关详细信息,请参阅Walkthrough: Creating Your First Application-Level Add-in for Outlook

答案 1 :(得分:0)

发现此功能后,该规则可以在不使用VBA的情况下根据需要设置规则,以便在对宏进行排序时,根据您将传入电子邮件移至的文件夹显示警报。

https://www.howto-outlook.com/howto/newmailalert.htm

向下滚动到“配置邮件警报以监视所有[l]文件夹;而不仅仅是收件箱。”

配置邮件警报以监视所有文件夹;不只是收件箱 “管理规则和警报”按钮默认情况下,新的“新邮件桌面警报”将仅在邮件传递到收件箱时显示。这意味着,当您配置了将邮件移动到其他文件夹的规则时,通知将不会显示。

要解决此问题,您可以为每个规则添加“显示桌面警报”操作。除了令人厌烦的事实外,真正的缺点是,当您在Exchange组织中时,该规则将成为本地规则,因此仅在Outlook运行时才执行。这意味着当您在规则中添加了其他操作(例如将其转发到另一个地址)后,这些操作也将不会执行。

一个更好的解决方案是创建一个没有条件的通用规则,而只是显示桌面警报的操作。

打开“规则和警报”对话框; Outlook 2007 工具->规则和警报… Outlook 2010,Outlook 2013和Outlook 2016 File->按钮:管理规则和警报 按钮新规则… 选择“从空白规则开始”,并确认已选择“检查邮件到达时”或“对收到的邮件应用规则”。 按下一步转到“条件”屏幕。 确认没有选择任何条件,然后按Next。 将会弹出警告,指出该规则将应用于所有消息。按“是”表示正确。 选择操作“显示桌面警报”。 按完成以完成规则。 如果需要,将“显示桌面警报”规则一直移到顶部。 新邮件桌面警报规则(单击图像可放大) 您可以创建一条规则,以显示收到的每封邮件的“新邮件桌面警报”。