Outlook和宏。无法更改文件夹或搜索

时间:2015-06-16 09:57:56

标签: outlook-vba

我制作了一个小宏来计算我的收件箱中有多少未读电子邮件。然后我将一些数据发送到串口并控制交通灯。

我的宏有问题,它有一个while循环,并不断检查收件箱。循环中有一个DoEvents,它们都很顺利。除了宏运行时的所有内容;

- 如果我点击未读电子邮件阅读,然后点击另一封电子邮件,之前的电子邮件现在应标记为已读。这不会发生,我必须手动将其标记为已读或双击以打开电子邮件。

- 我无法使用搜索功能,它只会等到我停止运行宏。

- 在我停止宏之前,我无法更改我正在查看的文件夹。

如何在不使用宏的循环的情况下定期计算我有多少未读电子邮件?

我看过创建一个新线程(在outlook中不可能),并且使用定时器(经常崩溃,定时器似乎无法预测)。

'Checks for unread email and sets Trafic Light color
Sub CheckMail()
runner = 1
MailTemp = -1
While (runner)
    Const olFolderInbox = 6
    Set objOutlook = CreateObject("Outlook.Application")
    Set objNamespace = objOutlook.GetNamespace("MAPI")
    objNamespace.Logon "Default Outlook Profile", , False, True
    Set objFolder = objNamespace.GetDefaultFolder(olFolderInbox)

    If MailTemp <> objFolder.UnReadItemCount Then
        MailTemp = objFolder.UnReadItemCount

        If objFolder.UnReadItemCount = 0 Then
            Shell "C:\Users\cave\Desktop\Miles Cave\TrafficLight\USB\Mail_0.bat", vbMinimizedNoFocus
        End If

        If objFolder.UnReadItemCount = 1 Then
            Shell "C:\Users\cave\Desktop\Miles Cave\TrafficLight\USB\Mail_1.bat", vbMinimizedNoFocus
        End If

        If objFolder.UnReadItemCount > 1 Then
            Shell "C:\Users\cave\Desktop\Miles Cave\TrafficLight\USB\Mail_2.bat", vbMinimizedNoFocus
        End If
    End If
    DoEvents
Wend
End Sub

'Sets Trafic Light to off and stops CheckMail
Sub StopMail()
    Shell "C:\Users\cave\Desktop\Miles Cave\TrafficLight\USB\Lights off.bat", vbMinimizedNoFocus
    runner = 0
End Sub

这是我的代码。在CheckMail()中,有5行代码可以获取未读电子邮件的数量,然后是if,以检查未读电子邮件的数量是否已更改,以及3个选项,根据电子邮件的数量进行操作。

StopMail()只需在CheckMail()中停止While循环。

2 个答案:

答案 0 :(得分:0)

您需要使用Items类的Find / FindNextRestrict方法来查找所有未读项目。例如,Restrict方法将过滤器应用于Items集合,返回一个新集合,其中包含原始中与过滤器匹配的所有项目。那么您可以简单地使用Items类的Count属性。

另请注意Namespace类的AdvancedSearch方法。它允许在另一个线程上运行搜索,并轻松获取多个文件夹中的未读项目数。

使用以下搜索条件= "[UnRead] = true"

您可能会发现以下文章有用:

答案 1 :(得分:0)

您可以通过至少两种方式在没有计时器或while循环的情况下触发。

1 - 使用ItemAdd收到邮件

2 - 当邮件的未读状态更改为使用ItemChange事件读取时,如此

在ThisOutlookSession

Private WithEvents checkMailItems As Items

Private Sub Application_Startup()
    Dim ns As Namespace
    Set ns = Application.GetNamespace("MAPI")
    Set checkMailItems = ns.GetDefaultFolder(olFolderInbox).Items
End Sub

Private Sub checkMailItems_ItemChange(ByVal Item As Object)
    If TypeOf Item Is mailItem And Item.UnRead = False Then CheckMail
End Sub

在常规模块中

Sub CheckMail()

    Dim objNameSpace As Namespace
    Dim objFolder As Folder
    Dim uIC As Long

    Set objNameSpace = Application.GetNamespace("MAPI")
    Set objFolder = objNameSpace.GetDefaultFolder(olFolderInbox)

    uIC = objFolder.UnReadItemCount

    Select Case uIC

    Case 0
        Debug.Print "Inside CheckMail - uIC = " & uIC
        'Shell "C:\Users\cave\Desktop\Miles Cave\TrafficLight\USB\Mail_0.bat", vbMinimizedNoFocus

    Case 1
        Debug.Print "Inside CheckMail - uIC = " & uIC
        'Shell "C:\Users\cave\Desktop\Miles Cave\TrafficLight\USB\Mail_1.bat", vbMinimizedNoFocus

    Case Is > 1
        Debug.Print "Inside CheckMail - uIC = " & uIC
        'Shell "C:\Users\cave\Desktop\Miles Cave\TrafficLight\USB\Mail_2.bat", vbMinimizedNoFocus

    End Select

ExitRoutine:
    Set objNameSpace = Nothing
    Set objFolder = Nothing

    Debug.Print "Procedure CheckMail is done."

End Sub