Outlook Count电子邮件标记为重要

时间:2017-06-21 01:59:29

标签: vba count outlook outlook-vba outlook-filter

有人可以指出我在这里缺少的东西。每次我运行它都说需要一个对象。

我道歉我觉得这是一个非常简单的修复,但我已经破坏了我的大脑一段时间。

基本上我想要完成的是计算有多少电子邮件被标记为高重要性。

我觉得这是一个如此简单的错误,但我仍在学习这个。

Sub CheckForImportance()

Dim myNs As Outlook.NameSpace
Dim infldr  As Outlook.Folder
Dim impMail As Outlook.MailItem
Dim ttlcount As Integer

Set myNs = Application.GetNamespace("MAPI")
Set infldr = myNs.GetDefaultFolder(olFolderInbox)
Set impMail = infldr.Items
Set ttlcount = 0

If impMail.Importance = olImportanceHigh Then ttlImp = ttlImp + 1

MsgBox ("count:" & ttlImp)

End Sub

2 个答案:

答案 0 :(得分:0)

Outlook将邮件项目,日历项目,任务等存储在称为商店的文件中。有时候人们说邮件等等都存储在PST文件中,这通常是正确的。但是,所有PST文件都是存储,但并非所有存储都是PST文件。

我记得发送到任何电子邮件地址的邮件的默认值是加载到同一商店的。在这种情况下,Set infldr = myNs.GetDefaultFolder(olFolderInbox)非常有用,因为默认收件箱位于该商店中。

使用Outlook 2016以及其他一些最新版本,默认情况下,每个电子邮件地址都有一个单独的商店。这些商店中的每一个都以电子邮件地址命名,例如:“JohnDoe@hotmail.com”或“DoeJ@gmail.com”。

将此宏复制到Outlook模块并运行它:

Sub DsplUsernameOfDefaultStore()

  Dim NS As Outlook.NameSpace
  Dim DefaultInboxFldr As MAPIFolder

  Set NS = CreateObject("Outlook.Application").GetNamespace("MAPI")
  Set DefaultInboxFldr = NS.GetDefaultFolder(olFolderInbox)

  Debug.Print DefaultInboxFldr.Parent.Name

End Sub

在我的系统上,此宏输出“Outlook Data File”。这是Outlook附带的默认商店,但我的电子邮件都没有加载到它。

您将需要以下内容:

Set infldr = Session.Folders("Xxxx").Folders("Inbox")

其中Xxxx是包含您要查询的收件箱的商店的名称。

下面我有三个替代宏来计算收件箱中高重要性电子邮件的数量。要点特别注意:

  • 版本1使用我在评论中建议的For Each循环。版本2使用For IndexVariable循环。据我所知,For两种类型都没有优势。我使用的任何一个看起来更方便的任务。版本3使用过滤器。我没有发现Outlook过滤器的用途经常足以成为其使用的专家,因此我通常使用For循环。 olImportanceHigh是一个值为2的常量。看起来你不能在Restrict字符串中使用常量,这就是[Importance] = 2的原因。
  • 我发现Debug.Print在开发过程中比MsgBox更方便。

如有必要,请回答有关我的代码的问题。

Option Explicit
Sub CountHighImportanceEmails1()

  Dim FldrInbox As Folder
  Dim MailItemCrnt As MailItem
  Dim NumEmailsHighImport As Long

  Set FldrInbox = Session.Folders("Xxxx").Folders("Inbox")

  NumEmailsHighImport = 0
  For Each MailItemCrnt In FldrInbox.Items
    If MailItemCrnt.Importance = olImportanceHigh Then
      NumEmailsHighImport = NumEmailsHighImport + 1
    End If
  Next

  Debug.Print "Number of high importance emails=" & NumEmailsHighImport

End Sub
Sub CountHighImportanceEmails2()

  Dim FldrInbox As Folder
  Dim InxMi As Long
  Dim NumEmailsHighImport As Long

  Set FldrInbox = Session.Folders("Xxxx").Folders("Inbox")

  NumEmailsHighImport = 0
  With FldrInbox
    For InxMi = 1 To .Items.Count
      If .Items(InxMi).Importance = olImportanceHigh Then
        NumEmailsHighImport = NumEmailsHighImport + 1
      End If
    Next
  End With

  Debug.Print "Number of high importance emails=" & NumEmailsHighImport

End Sub
Sub CountHighImportanceEmails3()

  Dim FldrInbox As Folder
  Dim MailItemsHighImport As Items

  Set FldrInbox = Session.Folders("Xxxx").Folders("Inbox")

  Set MailItemsHighImport = FldrInbox.Items.Restrict("[Importance] = 2")

  Debug.Print "Number of high importance emails=" & MailItemsHighImport.Count

End Sub

答案 1 :(得分:0)

示例将是

Option Explicit
Public Sub Example()
    Dim Inbox As Outlook.folder
    Set Inbox = Application.Session.GetDefaultFolder( _
                                    olFolderInbox)

    Dim Filter As String
        Filter = "[Importance] = 2"

    Dim Items As Outlook.Items
    Set Items = Inbox.Items.Restrict(Filter)

    Debug.Print Items.Count
    MsgBox Items.Count & " High importance Items are in " & Inbox.Name

End Sub